2016-04-01 13 views
5

tracertコマンドsome ipを使用してトレースするバッチファイルを作成し、トレースをtxtファイルに書き込む必要があります。私はそれが速いので、すべてのトレース要求を一度に開始させるための新しいコマンドを各トレースに対して開始したいと考えています。バッチ - txtファイルをバッチで同期ロックする方法はありますか?

私ping.batがある:

@echo off 
set saveUnrechableLocation=..\pingUnreachableInfo\pingUnrechableInfoDB.txt 
set IpListLocation=..\ipInfo\all_DB_ip.txt 
set reachableLocation=..\pingRechableInfo\RechableIp\pingRechableInfoDB.txt 
set trace=..\pingRechableInfo\tracert\tracertDB.txt 
set numberOfPings=1 
@echo pinging DB > %saveUnrechableLocation% 
copy /y NUL %reachableLocation% > NUL 
copy /y NUL %trace% > NUL 
for /F "tokens=*" %%A in (%IpListLocation%) do (
    ping -n %numberOfPings% %%A | find "TTL=" >nul 
    if errorlevel %numberOfPings% (
     @echo %%A not rechable >> %saveUnrechableLocation% 
    ) 
    if not errorlevel %numberOfPings% (
    @echo %%A >> %reachableLocation% 
    start trace.bat %trace% %%A 
    ) 
) 

、そのように見えるtrace.bat:

@echo off 
set saveLocation=%~1 
set ip=%~2 
tracert %ip% >> %saveLocation% 
exit 

問題は、私はこれを使用しようとしているとき、私は取得していますということですこの問題:

このプロセスは別のプロセスで使用されているため、ファイルにアクセスできません

この問題を解決するにはどうすればよいですか?ありがとう!

答えて

5

Windowsリダイレクトでは、複数のプロセスが同じファイルを書き込みアクセス用に同時に開くことはできません。書き込み操作をシリアル化する必要があります。これは、https://stackoverflow.com/a/9344547/1012053に示すように、バッチ処理で行うことができます。しかし、私はこのソリューションがあなたのケースで役立つとは思わない。

各tracertプロセスにはかなりの時間がかかり、出力は常にリダイレクトされなければなりません。しかし、複数のプロセスを同時に実行したい場合は、すべての出力を同じファイルにリダイレクトします。たとえそれを機能させようとしても、出力はインターリーブされ、あなたはそれが何を意味するのかを理解することはできません。

各tracertの出力を一意のファイルにリダイレクトすることをお勧めします。 IPアドレスを出力ファイル名に組み込むことができます。各プロセスが完了した後にファイルをマージするために示した手法を使用できます。

出力場所を渡す必要はありません。各子プロセスはトレース変数にアクセスできるため、正しい場所に簡単にリダイレクトできます。

ping.batの輪郭が

... 
set trace=..\pingRechableInfo\tracert\tracertDB 
... 
start trace.bat %%A 
... 

を変更するコメントなし短縮形は次のようになり

@echo off 
tracert %1 >%trace%_%1.txt %= Redirect TRACERT to unique temp file =% 
:merge 
2>nul ( %= Hide error messages inside the outer parentheses =% 
    >>%trace%.txt ( %= Attempt stdout redirection - Fails if already locked =% 
    type %trace%_%1.txt %= Write the temp file to the merge file =% 
    (call) %= Clear any error that TYPE may have generated =% 
) 
) || goto :merge %= Loop back and try again if stdout redirection failed =% 
del %trace%_%1.txt %= Delete the temporary file =% 
exit 

trace.bat修正:

@echo off 
tracert %1 >%trace%_%1.txt 
:merge 
2>nul (>>%trace%.txt (type %trace%_%1.txt&(call)))||goto :merge 
del %trace%_%1.txt 
exit 
+0

あなたの答えは大変ありがとうございます!私はそれのようなトレースvarに得ることができるか分からなかった。 ちょうど2つの簡単な質問: 1.トレースであなたはトレースを意味しますか?なぜなら私はvarという名前のトレーサを作成しなかったからです。 2.私はバッチを書くのにちょっと新しく、このラインは何をしていますか? "2> nul(タイプ%トレーサ%_%1.txt%トレーサ%.txt)" – Moshe9362

+1

@ Moshe9362 - 1)おっと!はい、私はトレーサではなく、 "トレース"変数を書くことを意味しました。 2)更新された答えを参照してください。 '%=これはコメントです=%'に注意してください。私は文法エラーのバグを修正しました。何らかの理由で一時ファイルが存在しなかった場合、無限ループにつながるかもしれない難解なバグも修正されました。実際には – dbenham

+0

は機能しません。 'tracertDB_10.0.0.1.txt'のようなファイルを作成しますが、プロセスの終了後にファイルを削除しなかったほか、tracertDB.txtにトレースをコピーせず、cmd-tracertコマンドを終了しませんでした。なにか提案を? – Moshe9362

1

これがあります一定dbenhamに基づくコード答え:

@echo off 
tracert %1 >%trace%_%1.txt 
:merge 
2>nul (
    >>%trace%.txt ( 
     type %trace%_%1.txt 
      (call) 
    ) 
) ||goto :merge 
del %trace%_%1.txt 
exit 
関連する問題