4

同時に X 回 (異なる引数で) 開始される .bat があります。特定の 1 つのファイルを変更してもらいたいのですが、制御可能な遅延で順番に実行する必要があります。理想的には、別のプロセスで同じことを許可するのではなく、必要な限り、1 つのバットだけがファイルをロックして処理できるようにするメカニズムが必要です。

4

2 に答える 2

7

jebの回答に対するいくつかの改善。

追加のロック ファイルは必要ありません。queue.txt ファイルは、独自のロックとして機能できます。

また、リダイレクトが失敗した場合にのみ再試行が行われるように、最も内側のブロックは SUCCESS (エラーレベル 0) で終了することが保証されている必要があります。(CALL )(末尾のスペースに注意してください)は、まったく直感的ではありませんが、エラーをクリアするための非常に効率的な方法です。ここでは必要ありませんが、(CALL)(スペースの不足に注意してください) エラーを設定する効率的な方法です。

:lockedAppend
2>nul (
  >>queue.txt (
    REM Do any amount of processing within this block.
    REM All stdout will safely be appended to the queue
    REM You could even call out to a subroutine, or another batch file

    echo Any text you want

    REM The CALL below ensures that the block exits with ERRORLEVEL 0 - success
    (call )
  )
)||goto :lockedAppend
于 2013-05-18T06:42:29.967 に答える
4

Dostips: parallel process with batch and SO: How do you have shared log files under Windows?で dbenham が説明しているファイル ロックで実行できます。.

Windows は、書き込みハンドルが開かれるとファイルをロックするため、互いにファイルにアクセスしようとするとエラーが発生します。

最初のプロセスはファイルにアクセスして書き込むことができますが、2 番目のプロセスはファイルを開くことができず、最初のプロセスが終了するまでループします。

:lockedAppend
2>nul (
  >queue.lock (
    >>queue.txt echo All text I want
  )
)||goto :lockedAppend
于 2013-05-18T06:02:06.480 に答える