Остановить пакетную команду, если она не завершается в течение определенного периода времени - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть простой пакетный файл, который запускает кучу файлов PHP, один за другим.Иногда некоторые из этих php-файлов зависают, и когда это происходит, весь пакетный файл перестает выполнять файлы, которые поступают после этого.

Есть ли способ остановить выполнение команды и перейти кследующая команда через заданный промежуток времени в пакетном скрипте?

Мой пакетный файл до сих пор состоит только из 800 строк с командой, аналогичной приведенной ниже:

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

Если, например,, вторая строка в приведенном выше списке зависает, весь пакетный файл будет зависать, а третья строка никогда не будет выполнена.

1 Ответ

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

Учитывая, что других процессов php72.exe нет, вы можете поставить перед каждым php72 вызовом префикс start "" /B и ставить после каждого php72 вызова следующие строки (уберите опцию /F, если вы не хотитепринудительно убить задачи):

timeout /T 10 /NOBREAK > nul
taskkill /IM "php72.exe" /F > nul 2>&1

Суффиксы > просто предотвращают выброс сообщений (ошибок).


Чтобы не копировать вышеупомянутые строки несколько разВы также можете поместить следующий код поверх командного файла:

@echo off
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 "" /B %%C
    rem // Wait for some time:
    timeout /T 10 /NOBREAK > nul
    rem // Kill the `php72` process (or actually all of them) if still running:
    taskkill /IM "php72.exe" /F > nul 2>&1
)
rem // Avoid to fall into the `php72` command lines another time:
exit /B

rem // These are your lines:
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

Конечно, вы можете иметь командные строки php72 в отдельном файле, тогда необходимо адаптировать цикл for /Fсоответственно:

rem // Specify appropriate text file:
for /F "usebackq delims=" %%C in ("D:\path\to\file.txt") do (
    rem // Same loop body as above...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...