2017-08-30 111 views
0

我有一个简单的健康检查脚本,用于检查下面列出的Windows共享驱动器的状态。为什么我的批处理文件没有错误输出从STDERR重定向到文件?

我得到所需的输出命令的工作时。但是,当出现错误时,我不会在输出文件中获得输出。我曾将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文件。

+0

echo不会写入stderr。 net.exe的确如此,但你并没有重定向它的输出。您必须重新考虑这一点,请考虑重定向cmd.exe的输出 –

回答

1

首先,阅读Microsoft文章约Using Command Redirection Operators

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

命令行echo %%s - %%n >> results.txt 2> err.txt输出背景命令处理的执行net use通过捕获并分配给循环变量nSTDOUT其中被重定向到文件results.txt电流指令过程的输出。

另外通过命令ECHO输出错误重定向到文件err.txt如果ECHO将输出一个错误消息。但是ECHO从不输出错误消息。这就是为什么err.txt不包含由命令NET任何输出错误信息的原因。

我建议用要捕获的net use标准和错误输出和评估的体的输出循环。

@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输出线从任何输出包含单词successfullyserver_list.txt线与成功消息被写入到文件results.txt。否则,最可能的错误输出也会从server_list.txt到文件err.txt的行写入。

相关问题