为什么我的批处理文件没有将错误输出从 STDERR 重定向到文件?

Why is no error output redirected from STDERR to file by my batch file?

我有一个简单的健康检查脚本,用于检查下面列出的 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 中放入一些不正确的条目以获得一些错误以供测试。错误输出显示在命令行 window 中,而不是打印到 err.txt 文件中。

首先,阅读有关 Using Command Redirection Operators 的 Microsoft 文章。

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

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

此外,如果 ECHO 将输出一条错误消息,则命令 ECHO 的错误输出将重定向到文件 err.txt。但是 ECHO 永远不会输出错误消息。这就是为什么 err.txt 不包含命令 NET.

输出的任何错误消息的原因

我建议用 FOR 捕获 net use 的标准和错误输出,并评估 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.

的行写入