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

时间:2017-08-30 13:43:22

标签: windows cmd stdout stderr

我有一个简单的运行状况检查脚本,用于检查下面列出的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文件。

1 个答案:

答案 0 :(得分:1)

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

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

命令行echo %%s - %%n >> results.txt 2> err.txt输出执行{strong> FOR 捕获的net use后台命令进程的输出,并将其分配给循环变量n STDOUT < / strong>当前命令进程被重定向到文件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的行写入。