【问题标题】:Why is no error output redirected from STDERR to file by my batch file?为什么我的批处理文件没有将错误输出从 STDERR 重定向到文件?
【发布时间】:2018-02-08 06:27:30
【问题描述】:

我有一个简单的健康检查脚本,用于检查下面列出的 Windows 共享驱动器的状态。

当命令有效时,我得到了所需的输出。但是,当出现错误时,我没有在输出文件中得到输出。我已经将 STDOUT 和 STDERR 视为一种可能的解决方案,但我还不能让它工作。

谁能帮我解决这个代码。

@echo off
echo START > results.txt
for /f %%s in (server_list.txt) do (
    echo %%s >> results.txt
    for /f "delims=" %%n in ('net use \\%%s') do (
        echo %%s - %%n >> results.txt 2> err.txt
    )
)

输出文件如下所示。

START
server1
server1 - The command completed successfully.
server2
server2 - The command completed successfully.

但是,err.txt 文件中没有任何内容。我确保在文件server_list.txt 中添加了一些不正确的条目,以获取一些测试错误。错误输出显示在命令行窗口中,而不是打印到err.txt 文件中。

【问题讨论】:

  • echo 不会写入 stderr。 net.exe 可以,但您没有重定向它的输出。您必须重新考虑这一点,考虑重定向 cmd.exe 的输出

标签: windows cmd stdout stderr


【解决方案1】:

首先,阅读微软关于Using Command Redirection Operators的文章。

其次,FOR命令在后台使用cmd.exe在一个新的命令进程中执行命令行net use \\%%s,这意味着没有可见的控制台窗口。写入STDOUT 的后台命令进程的输出被FOR 捕获并在下一行逐行处理。写入 STDERR 的错误输出被 FOR 重定向到当前正在运行的进程的错误输出,这就是为什么可以在命令进程执行的打开控制台窗口中看到错误输出的原因批处理文件。

命令行echo %%s - %%n >> results.txt 2> err.txt输出后台命令进程执行net useFOR捕获并赋值给循环变量n到当前命令的STDOUT的输出重定向到文件results.txt的进程。

另外,如果 ECHO 将输出错误消息,则命令 ECHO 的错误输出将重定向到文件 err.txt。但是 ECHO 不会输出错误信息。这就是 err.txt 不包含命令 NET 输出的任何错误消息的原因。

我建议使用net useFOR 标准和错误输出捕获并评估FOR 循环体中的输出。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
del err.txt 2>nul
echo START > results.txt
for /F %%I in (server_list.txt) do (
    for /f "delims=" %%J in ('%SystemRoot%\System32\net.exe use "\\%%I" 2^>^&1') do (
        set "NetOutput=%%J"
        if not "!NetOutput:successfully=!" == "!NetOutput!" (
            echo %%I - %%J>>results.txt
        ) else (
            echo %%I - %%J>>err.txt
        )
    )
)
endlocal

当命令 NET 从任何输出中输出的行包含单词successfully 时,来自server_list.txt 的行并将成功消息写入文件results.txt。否则,最可能的错误输出也会写入从server_list.txt 到文件err.txt 的行。

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2010-10-29
    • 2012-06-16
    • 2010-09-12
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多