我有很多批处理命令文件,如果它们运行,它们使用相同的资源。结果就是,即“杀”了对方。每个批处理作业都有不同的触发器,因此将它们排队并不容易。我如何将这些批处理排队以确保每个作业单独运行并在完成后开始下一个作业?
问问题
3280 次
2 回答
2
使用锁定文件。
在每个批处理文件的开头创建一个名为 lock.txt 的空文件,并在最后将其删除。然后在每个文件的最顶部添加一个等待循环并检查 lock.txt 是否存在。
于 2013-09-15T07:22:22.240 回答
0
我前段时间写了这个小批处理脚本,叫做QSTART
. 也许会有所帮助。
它允许您(理论上)创建和执行任何 BATCH 命令的队列。队列是存储在%TEMP%
目录中的纯文本文件。
这是一个非常简单的脚本,我在进行备份时使用 ie 来对 zip 命令进行排队。
我没有做太多调试,因此请随时纠正任何现有的错误。我不能 100% 确定它是否能正确处理每个 BATCH 命令字符串,但它应该适合简单的任务。
重要的。每个排队的命令都按原样执行。该脚本不检查任何错误,但循环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
于 2014-02-08T11:36:41.063 回答