在代码段之后,查找test_command
是否已成功执行;如果它给出了一些错误,那么它会将错误消息存储在err_msg
中。
FOR /F "delims=" %%a IN ('%test_command% 2^>^&1 1^>NUL') DO (
set err_msg="%%~a"
)
代码示例工作正常但我认为我完全不理解它。特别是这部分%test_command% 2^>^&1 1^>NUL
答案 0 :(得分:3)
2^>^&1 1^>nul
与^
相同,但是因为它在FOR / F中被称为命令{}}},这意味着 - 打印输出流( 1 或命令打印正常消息的地方)为nul(无)并将错误流( 2 或其中命令打印错误消息的位置)打印到输出流。
由于2>&1 1>nul
仅捕获输出流,因此强制FOR / F命令仅处理错误流。
答案 1 :(得分:3)
丢弃将特殊字符传递给^
所需的转义字符for /f
,2>&1
表示将句柄移至标准输出(第1流),复制它并使用 copy 作为标准错误流(流2)的输出,然后1>nul
将空设备设置为标准流的输出。
因此,它将进程发送的数据隐藏到标准输出流,并采用标准错误流,并将写入原始标准输出流。
只要for /f
或管道需要检索命令生成但发送到错误流的信息,就会使用此方法。 for /f
和管道命令都只处理标准输出流中的数据,因此,为了能够读取错误流,正常输出被丢弃(或不丢弃),并且错误被发送到原始输出流,因此它可以正确检索。
答案 2 :(得分:2)
%test_command% 2^>^&1 1^>NUL
此命令运行%test_command%
。
^
是一个转义字符(用于使>
被解释为重定向(管道字符)而不是普通字符。)
1^>NUL
将stdout重定向到nul
2^>^&1
将错误消息重定向到stdout。
所以stdout被扔掉了,stderr被重定向到stdout。
正常输出被丢弃,错误现在发送到正常输出。
来源Redirection和Syntax : Escape Characters, Delimiters and Quotes
逃脱角色
^
逃脱角色。在命令符号之前添加转义字符允许它 被视为普通文本。
当管道或重定向任何这些字符时,你应该加前缀 与逃脱角色:& \< > ^ |
e.g。 ^ \ ^& ^ | ^> ^< ^^