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

时间:2017-08-18 15:56:34

标签: batch-file net-use

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

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

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

    :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                      
        )
    )
    

1 个答案:

答案 0 :(得分:4)

写入错误输出以处理 STDERR (标准错误)。但 FOR 仅在'开始的单独命令进程中运行两个cmd.exe /C之间的命令行时,仅捕获为处理 STDOUT 而编写的标准输出背景。

正如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="禁止使用空格和水平制表符作为分隔符将捕获的行拆分为标记,因为它定义了一个空的分隔符列表。