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