请求代码示例的解释

Requesting Explanation of code sample

后面的代码段,判断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

2^>^&1 1^>nul 与(但使用 ^ 转义,因为它在 FOR /F 调用的命令中)2>&1 1>nul 意味着 - 打印输出流( 1 或命令打印其正常消息的位置)到 nul(无)并打印错误流(2 或命令打印其错误消息的位置)输出流。

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

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

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

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

%test_command% 2^>^&1 1^>NUL

此命令运行 %test_command%

^ 是一个转义字符(所以 > 被解释为重定向(管道字符)而不是普通字符)。

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

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

因此 stdout 被丢弃,stderr 被重定向到 stdout。

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


来源Redirection and Syntax : Escape Characters, Delimiters and Quotes

Escape Character

^ Escape character.

Adding the escape character before a command symbol allows it to be treated as ordinary text.

When piping or redirecting any of these characters you should prefix with the escape character: & \ < > ^ |

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