Пакетный скрипт для вызова исполняемого файла и выхода, если он зависает

Поэтому мне нужно написать пакетный сценарий, который запускает исполняемый файл и завершает работу сценария, как только исполняемый файл завершается (поэтому нет сценариев ожидания ip ping), но автоматически завершает выполнение исполняемого файла и выходит из сценария через 30 минут, если исполняемый файл все еще работает ( завис, не отвечает и т.д.)

Вот что у меня есть до сих пор. Оператор find правильно выводит количество совпадающих процессов, но моя проблема в том, что ERRORLEVEL всегда возвращает 0, независимо от того, запущены ли совпадающие исполняемые файлы.

Я новичок в пакетном написании сценариев, поэтому вполне возможно, что я упускаю из виду какую-то очень простую вещь.

@echo off
start calc.exe

REM loop 600 times, each loop being 3 seconds (30 minutes total)
FOR /L %%A IN (1,1,600) DO (

   REM find the running executable
   tasklist | find /I /C "calc.exe" > nul
   echo %ERRORLEVEL%

   Rem exit the script if no executable is found (i.e it has run successfully)
   if %ERRORLEVEL% eq 1 EXIT 

   Rem pause for 3 seconds
   ping 1.1.1.1 -n 1 -w 3000 > nul
)

REM kill executable if we haven't exited yet
taskkill /f /im calc.exe

Заранее спасибо!


person mtotho    schedule 24.06.2013    source источник


Ответы (2)


в блоке кода вам всегда нужно delayed expansion:

@echo OFF &SETLOCAL ENABLEDELAYEDEXPANSION 
start calc.exe

REM loop 600 times, each loop being 3 seconds (30 minutes total)
FOR /L %%A IN (1,1,600) DO (

   REM find the running executable
   tasklist | find /I /C "calc.exe" > nul
   echo !ERRORLEVEL!

   Rem exit the script if no executable is found (i.e it has run successfully)
   if !ERRORLEVEL! eq 1 EXIT 

   Rem pause for 3 seconds
   ping 1.1.1.1 -n 1 -w 3000 > nul
)

REM kill executable if we haven't exited yet
taskkill /f /im calc.exe
person Endoro    schedule 24.06.2013

Несколько измените вызов пакетного сценария на tasklist и find:

tasklist /FI "IMAGENAME eq calc.exe" | find /I "calc.exe" > nul

Это работает правильно, если я тестирую как с запущенной копией Calculator, так и без нее (Win7 64 в командном окне).

person Ken White    schedule 24.06.2013
comment
Спасибо за быстрый ответ, список задач /FI IMAGENAME eq calc.exe | find /C /I calc.exe правильно указывает, сколько экземпляров calc.exe у меня открыто, однако уровень ошибки всегда выводит 0, независимо от того, открыт он или нет. В качестве альтернативы я мог бы попытаться сохранить результат поиска как переменную и сравнить с ней, но я пытался сделать это безрезультатно. Я не мог правильно сохранить его как переменную - person mtotho; 25.06.2013
comment
Я получаю уровень ошибки 0, если он работает, и 1, если нет, что должно быть правильно. Не знаю, почему у вас будет иначе... - person Ken White; 25.06.2013