请求代码示例的说明

时间:2015-04-14 09:27:57

标签: batch-file cmd

在代码段之后,查找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

3 个答案:

答案 0 :(得分:3)

2^>^&1 1^>nul^相同,但是因为它在FOR / F中被称为命令{}}},这意味着 - 打印输出流( 1 或命令打印正常消息的地方)为nul(无)并将错误流( 2 或其中命令打印错误消息的位置)打印到输出流。

由于2>&1 1>nul仅捕获输出流,因此强制FOR / F命令仅处理错误流。

答案 1 :(得分:3)

丢弃将特殊字符传递给^所需的转义字符for /f2>&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。

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


来源RedirectionSyntax : Escape Characters, Delimiters and Quotes

  

逃脱角色

     

^逃脱角色。

     

在命令符号之前添加转义字符允许它   被视为普通文本。

     

当管道或重定向任何这些字符时,你应该加前缀   与逃脱角色:& \< > ^ |

     

e.g。 ^ \ ^& ^ | ^> ^< ^^