相关疑难解决方法(0)

Windows命令解释器(CMD.EXE)如何解析脚本?

我遇到了ss64.com,它为如何编写Windows命令解释器将运行的批处理脚本提供了很好的帮助.

但是,我一直无法找到批处理脚本的语法,扩展或不扩展的方法,以及如何逃避事情的良好解释.

以下是我无法解决的示例问题:

  • 如何管理报价系统?我制作了一个TinyPerl脚本
    (foreach $i (@ARGV) { print '*' . $i ; }),编译它并以这种方式调用它:
    • my_script.exe "a ""b"" c"?输出是 *a "b*c
    • my_script.exe """a b c"""?输出它*"a*b*c"
  • 内部echo命令如何工作?在那个命令中扩展了什么?
  • 为什么我必须for [...] %%I在文件脚本中使用,但for [...] %I在交互式会话中?
  • 什么是转义字符,以及在什么情况下?如何逃脱百分号?例如,我怎么能%PROCESSOR_ARCHITECTURE%字面回声?我发现echo.exe %""PROCESSOR_ARCHITECTURE%有效,有没有更好的解决方案?
  • 如何%配对?例:
    • set b=a,echo %a %b% c%%a a c%
    • set a =b,echo %a %b% c%bb c%
  • 如果此变量包含双引号,如何确保变量作为单个参数传递给命令?
  • 使用 …

windows parsing cmd batch-file variable-expansion

132
推荐指数
5
解决办法
6万
查看次数

为什么ErrorLevel仅在||之后设置 操作员重定向失败?

在重定向失败时(由于文件不存在或文件访问不足),ErrorLevel似乎没有设置该值(在以下示例中,文件test.tmp是写保护的,文件test.nil不存在):

>>> (call ) & rem // (reset `ErrorLevel`)

>>> > "test.tmp" echo Text
Access is denied.

>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0

>>> (call ) & rem // (reset `ErrorLevel`)

>>> < "test.nil" set /P DUMMY=""
The system cannot find the file specified.

>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
Run Code Online (Sandbox Code Playgroud)

但是,只要失败的重定向后面跟着||查询退出代码的条件连接运算符,ErrorLevel就会1意外地设置为:

>>> (call ) & rem // (reset `ErrorLevel`)

>>> (> "test.tmp" echo Text) || echo Fail
Access is denied.
Fail

>>> …
Run Code Online (Sandbox Code Playgroud)

windows cmd batch-file exit-code io-redirection

10
推荐指数
1
解决办法
666
查看次数

为什么我不能按顺序重定向到两个输入流`0 <`和`3 <`?

当我尝试将多个文件重定向到多个流时,如下例所示,一切都按预期工作:

3< stream3.txt 4< stream4.txt echo/
Run Code Online (Sandbox Code Playgroud)

类似的东西也可以使用更多的流和文件以及其他命令echo/,甚至是功能代码块.即使使用保留的输出流1,2似乎也能正常工作.

但是,只要我按照给定的顺序使用以下流执行此操作:

0< stream0.txt 3< stream3.txt echo/
Run Code Online (Sandbox Code Playgroud)

托管命令提示符实例立即关闭.

当我更改流的顺序时,它再次正常工作:

3< stream3.txt 0< stream0.txt echo/
Run Code Online (Sandbox Code Playgroud)

那么,cmd当我尝试输入 - 重定向到流03按此顺序时,为什么实例意外终止?

我使用的是Windows 7(x64).


当我cmd尝试执行上述失败的输入重定向之前,我打开一个新的命令提示符实例:

cmd
0< stream0.txt 3< stream3.txt echo/
Run Code Online (Sandbox Code Playgroud)

我可以读取出现的错误消息 - 假设文本文件包含其基本名称后跟换行符:

'stream3' is not recognised as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

当我执行以下操作时,我可以看到两个文件实际上都被重定向:

cmd /V
0< stream0.txt 3< stream3.txt (set /P #="" & echo/!#!)

cmd /V
0< stream0.txt …
Run Code Online (Sandbox Code Playgroud)

windows cmd io-redirection

6
推荐指数
1
解决办法
493
查看次数

cmd.exe重定向运算符的顺序和位置

首先是关于订单

以下工作重定向stdoutstrerrnul.

command 1>nul 2>&1
Run Code Online (Sandbox Code Playgroud)

以下不是

command 2>&1 1>nul
Run Code Online (Sandbox Code Playgroud)

为什么订单很重要?如何用人类易懂的语言阅读这些表达方式?

关于位置

这有效

command 1>nul 2>&1
Run Code Online (Sandbox Code Playgroud)

这也是

1>nul 2>&1 command
Run Code Online (Sandbox Code Playgroud)

为什么?任何有关语法规则的官方参考文档都会有所帮助.

cmd io-redirection

2
推荐指数
1
解决办法
613
查看次数