2017-08-30 10 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

エコーは標準エラー出力に書き込まれません。 net.exeは実行しますが、出力をリダイレクトしません。これをもう一度考え、cmd.exeの出力をリダイレクトすることを検討する必要があります –

答えて

1

まず、Using Command Redirection Operatorsに関するMicrosoftの記事を読んでください。

次に、 FORコマンドは可視コンソールウィンドウ手段をバックグラウンドでcmd.exeを使用して、新しいコマンド処理でコマンドラインnet use \\%%sを実行します。 STDOUTに書き込まれたこのバックグラウンドコマンドプロセスの出力は、forによってキャプチャされ、次の行ごとに処理されます。 STDERRに書き込まれたエラー出力はFORにリダイレクトされ、現在実行中のプロセスのエラー出力になります。これは、バッチファイルを実行しているコマンドプロセスのコンソールウィンドウでエラー出力が見える理由です。

コマンドラインecho %%s - %%n >> results.txt 2> err.txt FOR によって捕捉net useを実行するバックグラウンド・コマンド処理の出力を出力とresults.txtをファイルにリダイレクトされた現在のコマンド処理のSTDOUTにループ変数nに割り当てられます。

さらにコマンドECHOによるエラー出力はerr.txtかのECHO出力エラーメッセージをだろうをファイルにリダイレクトされます。しかし、ECHOはエラーメッセージを出力しません。そのため、err.txtには、コマンドNETによるエラーメッセージ出力が含まれていません。

私は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により、ライン出力がserver_list.txtから単語successfullyラインが含まれており、成功メッセージがresults.txtをファイルに書き込まれた場合。そうでなければ、最も可能性の高いエラー出力は、server_list.txtからファイルerr.txtまでの行でも書き込まれます。

関連する問題