@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
ECHO all done
DEL "%tempfile%a*" >NUL 2>NUL
GOTO :eof
)
FOR /L %%a IN (1,1,%instances%) DO (
IF NOT EXIST "%tempfile%a%%a" (
>"%tempfile%a%%a" ECHO.
START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
SHIFT
GOTO loop
)
)
timeout /t 1 >NUL
GOTO loop
GOTO :EOF
Где oneconversion.bat находится
@ECHO OFF
SETLOCAL
START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"
DEL "%~2" >NUL 2>NUL
cls
exit
В качестве макета для проверки принципа я использовал oneconversion.bat
@ECHO OFF
SETLOCAL
TITLE Processing %~1
SET /a wait=%~3*6
timeout /t %wait%
DEL "%~2" >NUL 2>NUL
CLS
exit
вот почему предоставляется третий параметр - он нужен только для того, чтобы сделать oneconversion.bat
переменной длины.
Операция довольно проста: создать фиктивный временный файл и предположить, что это имя файла + номер доступны в качестве файла флага.
для каждого доступного экземпляра (установленного на 4 - может быть практически любым) проверьте файл флага, если он отсутствует, создайте его и отправьте следующее преобразование, передав требуемое имя файла и имя временного файла. Когда преобразование будет завершено, уничтожьте временный файл.
Изменить, чтобы быть более общительным:
@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
IF EXIST "%tempfile%a" DEL "%tempfile%a"&ECHO All jobs started&GOTO loop
IF EXIST "%tempfile%a*" GOTO delay
ECHO all done
pause
GOTO :eof
)
FOR /L %%a IN (1,1,%instances%) DO (
IF NOT EXIST "%tempfile%a%%a" (
>"%tempfile%a%%a" ECHO.
START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
SHIFT
GOTO loop
)
)
:delay
timeout /t 1 >NUL
GOTO loop
GOTO :EOF
Очень маленькие изменения:
Когда nextfile
оказывается равным not defined
, все параметры исчерпаны. Найдите временный файл "%tempfile%a" - он не имеет номера экземпляра и был произвольно удален. Если он существует, удалите его и покажите сообщение «все задания запущены» — задания по-прежнему будут выполняться, но больше не будут добавляться, и вернитесь к циклу.
В следующий раз, когда параметры не будут найдены, «%tempfile%a» не будет существовать, поэтому проверьте, существует ли какой-либо "%tempfile%a*"
, что будет указывать на то, что вспомогательный пакет не завершен. Если такой файл существует, перейдите к delay
, подождите секунду и повторите попытку.
Когда все задания будут завершены, отобразите all done
и сделайте паузу, чтобы сообщение было прочитано.
Естественно, если вы вставите символ control-g в отображаемое сообщение, прозвучит звуковой сигнал, если вы хотите звуковое оповещение.
person
Magoo
schedule
15.02.2015