Batch file 请求解释代码示例

Batch file 请求解释代码示例,batch-file,cmd,Batch File,Cmd,在代码段之后,查找test_命令是否已成功执行;如果它给出了一些错误,那么它会将错误消息存储在err\u msg中 FOR /F "delims=" %%a IN ('%test_command% 2^>^&1 1^>NUL') DO ( set err_msg="%%~a" ) 代码示例工作正常,但我认为我没有完全理解它。具体地说,这一部分%test_命令%2^>^&11^>NUL2^>^&11^>NUL与(但使用^转义,因为它在FOR/F中调用了命令)2>&11>NUL

在代码段之后,查找
test_命令
是否已成功执行;如果它给出了一些错误,那么它会将错误消息存储在
err\u msg

FOR /F "delims=" %%a IN ('%test_command% 2^>^&1 1^>NUL') DO (
set err_msg="%%~a"
)

代码示例工作正常,但我认为我没有完全理解它。具体地说,这一部分
%test_命令%2^>^&11^>NUL
2^>^&11^>NUL
与(但使用
^
转义,因为它在FOR/F中调用了命令)
2>&11>NUL
,这意味着将输出流(1或命令打印其正常消息的位置)打印到NUL(无)并将错误流(2或命令打印错误消息的位置)打印到输出流


由于
FOR/F
仅捕获输出流,这将强制FOR/F命令仅处理错误流。

丢弃将特殊字符传递到
FOR/F
所需的转义字符
^
2>&1
意味着获取标准输出的句柄(流1),复制它并使用复制作为标准错误流(流2)的输出,然后
1>nul
将空设备设置为标准流的输出

因此,它隐藏了进程发送到标准输出流的数据,并获取标准错误流并将is写入原始标准输出流

每当/f或管道需要检索由命令生成但发送到错误流的信息时,就会使用此选项。对于/f和管道命令都只处理标准输出流中的数据,因此,为了能够读取错误流,将丢弃(或不丢弃)正常输出,并将错误发送到原始输出流,以便正确检索

%test_command% 2^>^&1 1^>NUL
此命令运行
%test\u命令%

^
是转义字符(用于将
解释为重定向(管道字符),而不是普通字符)

1^>NUL
将标准输出重定向到
NUL

2^>^&1
将错误消息重定向到标准输出

所以stdout被丢弃,stderr被重定向到stdout

正常输出被丢弃,错误现在被发送到正常输出


来源和

转义字符

^
转义字符

在命令符号之前添加转义字符可使其 作为普通文本处理

当管道或重定向这些字符中的任何一个时,您应该使用前缀 带有转义字符:&\<>^|

e、 g.^^^&^^^^>^<^^