У меня есть программа 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 завершена, то больше не ждите?

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

1
kensaii 21 Окт 2017 в 03:27

3 ответа

Лучший ответ

Благодаря @Squashman я смог создать скрипт самостоятельно. кажется, работает нормально

@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 в зависимости от того, как часто он проверяет)

0
kensaii 22 Окт 2017 в 16:15

Я думаю, что это гораздо более простое решение:

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 завершаются.

3
Aacini 23 Окт 2017 в 15:32

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

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

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

0
Trass3r 27 Фев 2018 в 11:26