2017-08-30 112 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的行寫入。

相關問題