Он корректно возвращает код завершения процесса тестирования, также работает, если вы порождаете несколько процессов тестирования одновременно, и не появляется всплывающие окна все время.

я естьX.exe Программа, которая занимает около 2-6 часов, чтобы закончить. Точное время неизвестно, но я бы хотел установить порог в 6,5 или 7 часов. Если эта программа не вернет никакого значения за это время, она будет уничтожена. Как я могу реализовать это с помощью пакета*.bat файлы?

Вот что у меня было до сих пор: таймерbat1.bat и фактическийbat2.bat.

bat1.bat:

start cmd /C bat2.bat & timeout /t 25200 & taskkill /im X.exe /f

bat2.bat:

cd blah
bat1.bat

Проблема с этим подходом состоит в том, что только через 25200 секунд (или 7 часов) таймер будет остановлен, и он не будет остановлен до этого предела. Как мне сказать компьютеру, что если программаX.exe закончено, тогда не ждите больше?

Любая помощь приветствуется!

 Squashman21 окт. 2017 г., 06:15
Если вы настроили x.exe для запуска в качестве запланированной задачи, вы можете попросить его остановить задачу через 8 часов. К сожалению, ваши единственные параметры в планировщике задач - 1, 2, 4, 8 или 12 часов. Что вы могли бы сделать, это использоватьTASKLIST команда, чтобы проверить, работает ли программа каждые 300 секунд. Если он не запущен, то файл bat может выйти. Если он все еще работает, проверьте, сколько секунд он пробежал, и убейте его, если он составляет 25 200 секунд.
 kensaii22 окт. 2017 г., 06:55
@ Squashman спасибо большое, я думаю, что я понял это согласно вашему выше комментарию. хорошего дня!
 kensaii21 окт. 2017 г., 22:44
@ Сквошман спасибо за идею и команду. У меня есть простой сценарийtasklist /fi "imagename eq X.exe", но как вы возвращаете количество времени, котороеX.exe был запущен? Можете ли вы дать официальный ответ, чтобы я тоже мог принять его? Спасибо!!!
 Squashman22 окт. 2017 г., 00:33
Установите три переменные. % checktime%% elapsedtime% и% killtime%. Используйте переменную% checktime% сTIMEOUT команда. Затем используйтеTASKLIST Команда, чтобы увидеть, если процесс запущен. Если он запущен, добавьте% checktime% к% elapsedtime%. Затем проверьте, больше ли% elapsedtime% или равно% killtime%. Если условие уничтожения не было выполнено, используйтеGOTO команда вернуться к метке передTIMEOUT команда. Если условие времени уничтожения выполнено, используйтеTASKKILL Команда остановить процесс.

Ответы на вопрос(3)

Решение Вопроса

работает нормально

@echo off
setlocal enableextensions enabledelayedexpansion
set /a "checktime=60"
set /a "elapsedtime=0"
set /a "killtime=150"
set XProg=X.exe
start cmd /C runTest.bat 
timeout /t 10
:while1
    echo Go to WHILE loop.
    echo elapsedtime = %elapsedtime% 
    echo killtime = %killtime%
    set /a "timeleft = %killtime% - %elapsedtime%"
    echo timeleft = %timeleft%
    if /i %timeleft% geq 0 (
        tasklist /fi "imagename eq %XProg%" 2>NUL | find /i /n "%XProg%">NUL
        if "%ERRORLEVEL%"=="0" (
            echo %XProg% is still running...
        ) else (
            echo %XProg% is finished before timer.
        )
        set /a "elapsedtime = elapsedtime + checktime"
        timeout /t %checktime%
        goto :while1
    ) else (
        taskkill /im %XProg% /f
        echo %XProg% is terminated.
    )

извлеченные уроки: 1. трудно сравнивать числовые переменные в пакете (вместо сравнения diff с 0) 2. завершается впервыеelaspedtime > killtime (может быть немного длиннее, чемkilltime смотря как часто это проверяет)

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

"C:\Program Files\Git\usr\bin\timeout.exe" 5 .\test.exe

Он корректно возвращает код завершения процесса тестирования, также работает, если вы порождаете несколько процессов тестирования одновременно, и не появляется всплывающие окна все время.

rem Start the process that will kill the X.exe program after 7 hours
start "WaitingToKill" cmd /C timeout /t 25200 ^& taskkill /im X.exe /f

rem Run the X.exe program and wait for it to terminate
X.exe

rem Kill the killer process and terminate
taskkill /fi "WINDOWTITLE eq WaitingToKill" /f

В этом методе нет никакого дополнительного кода, выполняющегося одновременно; просто состояние ожиданияtimeout команда.

РЕДАКТИРОВАТЬ: Добавлены некоторые объяснения

Обратите внимание, что оба процесса "WaitingToKill" cmd.exe сtimeout командование иX.exe Программа работает параллельно. Еслиtimeout Команда заканчивается через 7 часов,taskkill /im X.exe /f команда выполнена,X.exe программа убита и оба процесса cmd.exe завершаются.

ЕслиX.exe Программа заканчивается до 7 часов, пакетный файл выполняет следующую строкупо-прежнему, Эта строкаtaskkill /fi "WINDOWTITLE eq WaitingToKill" /f, так что окно сtimeout команда убита и оба процесса cmd.exe завершаются.

 sst27 июл. 2018 г., 13:03
+1. Хорошая идея! тем не мениеtaskkill /fi "WINDOWTITLE eq WaitingToKill" /f не убьетtimeout.exe потому что это не имеетWindow Title, Могу ли я предложить вам заменить его наtaskkill /im cmd.exe /fi "WINDOWTITLE eq WaitingToKill" /f /t, Также у меня есть идея расширить ваше решение, чтобы не было отдельного окна длякиллер процесс, который я могу опубликовать в качестве альтернативного ответа, если вы не возражаете.
 Aacini23 окт. 2017 г., 18:32
Чтобы быть понятнее: когда убитьX.exe программа? когдаtimeout Команда заканчивается. Когда убитьtimeout команда? когдаX.exe Программа заканчивается (если я не понял ваше требование:/) ...
 Aacini30 окт. 2017 г., 18:17
Так? Это намного более простое решение работало правильно?
 Aacini23 окт. 2017 г., 17:29
Вам не нужно периодически что-либо проверять: оба процесса должны заканчиваться, когда заканчивается другой процесс, поэтому нужно только дождаться завершения одного процесса и завершить работу другого процесса в это время. Смотрите мои изменения ...
 kensaii23 окт. 2017 г., 17:09
спасибо за ответ, но именно поэтому и задан вопрос:X.exe иногда заканчивается до таймера, поэтому я хотел бы периодически проверять, запущена ли программа. ответ, который вы предлагаете, практически совпадает с моим прежним решением. я где-то ошибаюсь?

Ваш ответ на вопрос