【问题标题】:How to process 'net use' command error output in batch file with a FOR loop?如何使用 FOR 循环处理批处理文件中的“net use”命令错误输出?
【发布时间】:2018-01-27 09:04:15
【问题描述】:

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

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

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

以下是我的代码:

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

【问题讨论】:

  • 错误输出到第二个 io 流。要将其与正常输出合并使用 2>&1 在 for /f commnad 中,您需要转义 2^>^&1

标签: batch-file net-use


【解决方案1】:

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

解决方案是使用 2>&1,正如 Microsoft 在有关 Using Command Redirection Operators 的文章中所解释的那样。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多