如何使用 FOR 循环处理批处理文件中的 'net use' 命令错误输出?

How to process 'net use' command error output in batch file with a FOR loop?

我在批处理文件中使用 net use 命令连接远程位置。
我想将它的输出存储到一个变量中并对其进行处理。
当命令成功完成时,我的代码工作正常。

但是,如果出现一些错误,比如密码错误,那么我无法将错误输出存储在变量中。它直接打印到控制台window,其中脚本是运行。请帮助解决以下问题:

  1. 为什么会这样?
    为什么我在命令输出出错时无法将输出存储到变量中?
  2. 是否有合适的方法来记录 'net use' 命令的 ERROR 输出?

以下是我的代码:

:connNEWlocation
echo Connecting required remote location...
for /f "tokens=1,2,3,4,5,6,7,8 delims=*" %%a IN ('net use  \!hostaddress!\!user! /user:!user! !user_pass!') DO (
    if "%%a"=="The command completed successfully." (
        echo Connected successfully^!
    ) else (
        echo ERROR:"%%a"
        echo do something based on error obtained here                      
    )
)

错误输出被写入处理STDERR(标准错误)。但是 FOR 仅捕获写入的标准输出以处理 STDOUT 上的 运行 两个 ' 之间的命令行在一个单独的命令进程在后台以 cmd.exe /C 开始。

Microsoft 在有关 Using Command Redirection Operators.

的文章中解释说,解决方案是使用 2>&1

在这种情况下,两个运算符 >& 必须使用脱字符 ^ 进行转义,以便在解析整个 FOR 时首先将其解释为文字字符在 FOR 命令行完全执行之前,Window 命令处理器的 命令行。

for /F "delims=" %%a in ('net use \!hostaddress!\!user! /user:!user! !user_pass! 2^>^&1') do (

"delims=" 禁用使用 space 和水平制表符作为分隔符将捕获的行拆分为标记,因为它定义了一个空的分隔符列表。