実行中の場合、同じリソースを使用するバッチコマンドファイルがたくさんあります。その結果、お互いを「殺し合う」ことになります。各バッチ ジョブには異なるトリガーがあるため、それらをキューに入れるのは簡単ではありません。このバッチをキューに入れ、各ジョブが単独で実行され、終了したら次のジョブが開始されることを確認するにはどうすればよいですか?
2 に答える
ロックファイルを使用します。
各バッチ ファイルの先頭に lock.txt という空のファイルを作成し、最後に削除します。次に、各ファイルの一番上に待機ループを追加し、lock.txt の存在を確認します。
という名前のこの小さなバッチ スクリプトを少し前に書きましたQSTART
。多分それは助けになるでしょう。
これにより、(理論的には)任意の BATCH コマンドのキューを作成して実行できます。%TEMP%
キューは、ディレクトリに保存されるプレーン テキスト ファイルです。
これは、バックアップを行うときに zip コマンドをキューに入れるために使用する非常に単純なスクリプトです。
私はあまりデバッグを行っていないので、既存のバグを自由に修正してください。すべての BATCH コマンド文字列を適切に処理できるかどうかは 100% わかりませんが、単純なタスクには適しているはずです。
重要。キューに入れられたすべてのコマンドは、そのまま正確に実行されます。スクリプトはエラーをチェックしませんが、ループERRORLEVEL
内の単純な検証で修正できます。FOR
また、私はプロのプログラマーではなく、スクリプトが少し面倒であることを認識しています (つまり、キュー コマンドを実行する他の方法を知りませんでした。組み込みSTART
コマンドが機能しない場合があります)。
スクリプトの最後にヘルプといくつかの例があります。QSTART
表示するには、引数なしで使用します。
@echo OFF
setlocal
rem qstart root directory
set ROOT=%~dp0
call :DEBUG "qstart root directory: %ROOT%"
rem queue storage directory
set QDIR=%TMP%
call :DEBUG "queue directory: %QDIR%"
rem 1.parameter (mandatory) - queue ID
rem if no queue ID given display help message
set QID=%~1
call :DEBUG "queue ID: %QID%"
if "%QID%"=="" goto :MSG_HELP
set QFILE=%QDIR%\%QID%.Q
call :DEBUG "queue file: %QFILE%"
shift
rem 2. parameter (mandatory) - queue operation
set QOP=%~1
shift
call :DEBUG "queue operator: %QOP%"
if "%QOP%"=="add" goto :QADD
if "%QOP%"=="list" goto :QLIST
if "%QOP%"=="load" goto :QLOAD
if "%QOP%"=="new" goto :QNEW
if "%QOP%"=="remove" goto :QREMOVE
if "%QOP%"=="run" goto :QRUN
if "%QOP%"=="save" goto :QSAVE
goto :ERR_SYNTAX
rem add command to queue
rem create queue if not exists
:QADD
if not exist "%QFILE%" call :QNEW
set QCMD=:
:NEXTPAR
set QCMD=%QCMD% %1
shift
if not "%~1"=="" goto :NEXTPAR
set QCMD=%QCMD:: =%
call :DEBUG "queued command: %QCMD%"
echo %QCMD% >>"%QFILE%"
goto :EOF
rem list queued commands
rem warn if queue not exists
:QLIST
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
type "%QFILE%"
)
goto :EOF
rem import queue from file
rem create queue if not exists
rem warn if file not exists
:QLOAD
if not exist "%QFILE%" call :QNEW
set FILE=%~1
call :DEBUG "load file: %FILE%"
if not exist "%FILE%" (
call :ERR_NOFILE
) else (
copy /B /Y "%QFILE%"+"%FILE%" "%QFILE%" >NUL
)
goto :EOF
rem clear queue
rem create queue if not exists
:QNEW
if exist "%QFILE%" call :QREMOVE
copy /B /Y NUL "%QFILE%" >NUL
goto :EOF
rem remove queue
rem warn if queue not exists
:QREMOVE
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
del /F /Q "%QFILE%" >NUL
)
goto :EOF
rem execute queued commands
rem clear queue after execution
:QRUN
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=* delims=" %%C in (%QFILE%) do (
%%C
rem alt.way of execution: start "" /B /WAIT %%C
call :DEBUG "ERROR LEVEL of last operation: !ERRORLEVEL!"
)
endlocal
rem call :QREMOVE
call :QREMOVE
)
goto :EOF
rem export queue to file
rem warn if queue not exists
rem overwrite file if exists
:QSAVE
set FILE=%~1
call :DEBUG "save file: %FILE%"
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
copy /B /Y "%QFILE%" "%FILE%" >NUL
)
goto :EOF
rem messages ------------------------------------------------------------------
rem bad syntax error
rem show help
:ERR_SYNTAX
echo ERROR: syntax error
call :MSG_HELP
goto :EOF
rem bad queue id error
:ERR_BADQID
echo ERROR: bad queue ID '%QID%'
goto :EOF
rem file not found error
:ERR_BADFILE
echo ERROR: file not found '%FILE%'
goto :EOF
rem usage information
:MSG_HELP
echo qstart v.0.1.5 - by rapia19@interia.pl
echo Allows to create and execute queues of BATCH commands.
echo.
echo USAGE: qstart {QUEUE_ID} {QUEUE_OPERATOR} {COMMAND or FILE}
echo qstart {-h^|--help^|?^|/?}
echo {QUEUE_ID} queue ID
echo {QUEUE_OPERATOR} queue operator
echo {COMMAND} queued command call
echo {FILE} import/export filename
echo -h --help ? or /? shows ^(this^) help message
echo Allowed operations:
echo add {COMMAND} adds command to the queue
echo list lists all queued commands
echo load {FILE} imports ^(appends^) queued commands from a file
echo new creates new or clears existing queue
echo remove deletes queue
echo run executes all queued command and deletes queue
echo save {FILE} exports queue to a file
echo ALSO:
echo set QDEBUG=1 turns on displaying debug messages
echo EXAMPLES:
echo qstart Hello add echo "Hello world!"
echo qstart Hello add pause
echo qstart Hello list
echo qstart Hello save Hello-copy.txt
echo qstart Hello new
echo qstart Hello load Hello-copy.txt
echo qstart run
pause
goto :EOF
rem display debug message and pause
:DEBUG
if "%QDEBUG%"=="1" (
echo ### DEBUG INFO ### %~1
pause >NUL
)
goto :EOF