如何将错误流重定向到变量

How to redirect error stream to variable

我有以下一段代码。我想获取错误流,在 for 循环中执行命令后将其放入变量中,同时我通过将其发送到 NUL 来丢弃 stdout

 for /f "delims=" %%a IN ('%test_command% 2^>^&1 1^>NUL') do (
           set err_msg="%%~a"
    )

我想为其添加一项功能。除了将 stdout 发送到 NUL 我想将其存储在一个文件中,我该如何添加该功能?

使用下面的代码我可以将输出存储到文件中:

for /f "delims=" %%a IN ('%test_command% 2^>^&1 1^>temp.txt') do (
           set err_msg="%%~a"    
)

但是我想将输出存储到一个变量中,我该怎么做?

只存储第一行:

set /p var=<temp.txt

类似于:

do (
    set err_msg="%%~a" && set /p var=<temp.txt
)

存储多行:

要从 temp.txt 获取多行到变量中,请使用 DelayedExpansion 和第二个 for 循环:

setlocal EnableDelayedExpansion
...
for /f "Tokens=* Delims=" %%x in (temp.txt) do set var=!var!%%x

来源Set - Display, set, or remove CMD environment variables

To place the first line of a file into a variable:

Set /P _MyVar=<MyFilename.txt

为了将 std 错误传递给变量,我创建了一个 FOR 循环,它将 std in 和 err 重定向到 findstr 命令,然后让您捕获要查找的文本。

FOR /F "eol=; tokens=1-2 delims=" %a in ('*command* 2^>^&1^|findstr /I "*text*"') do (set x=%a)