Не могу понять, что является причиной ошибки в этом пакетном скрипте - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующий пакетный файл

@echo off
setlocal enableextensions enabledelayedexpansion

rem // Read all lines from this batch file that begin with `php72 ` and iterate over them:
for /F "delims=" %%C in ('
    findstr /BIC:"php72 " "%~f0"
') do (
    rem // Execute the currently iterated `php72` command line:
    start %%C

    SET checktasklist=true
    FOR /L %%A IN (1,1,30) DO (
        FOR /F %%x IN ('IF "!checktasklist!" == "true" tasklist /NH /FI "IMAGENAME eq php72.exe"') DO (
            IF "%%x" == "php72.exe" (
                timeout /T 1 /NOBREAK >NUL
            ) ELSE (
                SET checktasklist=false
            )
        )
    )
    taskkill /IM "php72.exe" /F > nul 2>&1
)
rem // Avoid to fall into the `php72` command lines another time:
exit /B

php72 ../simulation.php --version 0.9.0.4 --hashsimmilar false --thinkahead 0 --detailed 0 --outfile catacombs.outfile.csv --workingdir "C:/xampp/htdocs/rpg_prog/" --customfight 1,2,,,,1,,,1,,0,0,0,Catacombs1
php72 ../simulation.php --version 0.9.0.4 --hashsimmilar false --thinkahead 1 --detailed 0 --outfile catacombs.outfile.csv --workingdir "C:/xampp/htdocs/rpg_prog/" --customfight 1,2,,,,1,,,1,,0,0,0,Catacombs1
php72 ../simulation.php --version 0.9.0.4 --hashsimmilar false --thinkahead 2 --detailed 0 --outfile catacombs.outfile.csv --workingdir "C:/xampp/htdocs/rpg_prog/" --customfight 1,2,,,,1,,,1,,0,0,0,Catacombs1
.... continued with 190 lines of more simmilar lines like the above

В этом пакетном файле я пытаюсь выполнить все команды php72.exe ..., подождать 30 секунд, но только если они все еще работаюти если они все еще работают через 30 секунд, завершите их и перейдите к следующей строке php72.exe ....

Мне удалось этого добиться, но большую часть времени будет запускаться файл php72.exeпримерно через 0,8 секунды, но я все еще выполняю команду tasklist /NH... 30 раз, и это замедляет процесс.Вот почему я хотел поместить локальную переменную внутрь, чтобы, если задача не выполнялась после итерации, мне не нужно повторно проверять ее на оставшееся количество итераций.

Сейчас я получаю"true" was unexpected at this time. эта ошибка.Я не понимаю, почему это происходит, или как я могу достичь желаемого поведения.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема в части IF "!checktasklist!" == "true": поскольку она появляется в пределах for /F, неэкранированные = -знаки преобразуются в пробелы, поэтому их необходимо экранировать, например:

        ...
        FOR /F %%x IN ('IF "!checktasklist!" ^=^= "true" ...') DO (
        ...

Вы также можете изменить значение FALSE переменной флага checktasklist на пустое и просто использовать вместо него if defined:

    ...
    SET "checktasklist=true"
    FOR /L %%A IN (1,1,30) DO (
        FOR /F %%x IN ('if defined checktasklist tasklist /NH /FI "IMAGENAME eq php72.exe"') DO (
            IF "%%x" == "php72.exe" (
                timeout /T 1 /NOBREAK >NUL
            ) ELSE (
                SET "checktasklist="
            )
        )
    )
    ...

Совершенно другой подход, основанный на оригинальном сценарии :

Как насчет замены строки:

start "" /B %%C

на эту:

start "" /B cmd /C %%C ^& taskkill /IM "timeout.exe" /F ^> nul 2^>^&1

Это должно завершить процесс timeout (-es)после завершения каждого php72 процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...