我遇到了ss64.com,它为如何编写Windows命令解释器将运行的批处理脚本提供了很好的帮助.
但是,我一直无法找到批处理脚本的语法,扩展或不扩展的方法,以及如何逃避事情的良好解释.
以下是我无法解决的示例问题:
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%
在重定向失败时(由于文件不存在或文件访问不足),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) 当我尝试将多个文件重定向到多个流时,如下例所示,一切都按预期工作:
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
当我尝试输入 - 重定向到流0
并3
按此顺序时,为什么实例意外终止?
我使用的是Windows 7(x64).
当我cmd
尝试执行上述失败的输入重定向之前,我打开一个新的命令提示符实例:
cmd
0< stream0.txt 3< stream3.txt echo/
Run Code Online (Sandbox Code Playgroud)
我可以读取出现的错误消息 - 假设文本文件包含其基本名称后跟换行符:
Run Code Online (Sandbox Code Playgroud)'stream3' is not recognised as an internal or external command, operable program or batch file.
当我执行以下操作时,我可以看到两个文件实际上都被重定向:
cmd /V
0< stream0.txt 3< stream3.txt (set /P #="" & echo/!#!)
cmd /V
0< stream0.txt …
Run Code Online (Sandbox Code Playgroud) 首先是关于订单
以下工作重定向stdout
和strerr
到nul
.
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)
为什么?任何有关语法规则的官方参考文档都会有所帮助.