Ограничение времени командной строки Windows

Как я могу ограничить время выполнения программы командной строки в Windows? Я знаю, что в Linux есть время ожидания / ограничения по времени, но я не смог найти аналогичные утилиты для Windows.

5 ответов

start yourprogram.exe
ping 127.0.0.1 -n 10
taskkill /im yourprogram.exe

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

Я использовал 10 секунд в качестве примера, просто настроить ваши потребности.

Кроме того, если вы используете Vista или выше, вы можете отказаться от ping линия и использовать гораздо проще timeout команда на своем месте

timeout /t 10

Как я знаю, кажется, что такой функции не существует, но я думаю, что это выполнимо, если вы запускаете ее как задачу Windows через планировщик задач, оттуда вы можете установить ограничение на выполнение, параметр с именем: Остановить задачу, если она выполняется больше, чем:, вы можете получить более подробную информацию здесь: http://technet.microsoft.com/en-us/library/cc722178.aspx

Решение:

В windows нужно сделать три командных файла

process.bat

@ECHO OFF
start   /b cm.bat
start  cmd.exe /c run.bat
EXIT

cm.bat

@ECHO OFF
a.exe < input.txt > out.txt
taskkill /im a.exe /f
taskkill /im cmd.exe /f
EXIT

run.bat

@ECHO off
timeout /t 5
taskkill /im a.exe /f 
taskkill /im cmd.exe /f

EXIT

Теперь запустите process.bat . он запускает и cm.bat, и run.bat одновременно / параллельно. Когда a.exe из cm.bat завершается; cm.bat убивает run.bat и, таким образом, он будет работать как тайм-аут Ubuntu.

Если вы можете быть обеспокоены использованием PowerShell:$app = Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt' запустит блокнот с аргументом test.txt (вы можете разделить несколько аргументов ,,

Start-Sleep -Seconds 10 будет спать в течение 10 секунд.

Или $app.Kill() или же taskkill /PID $app.Id убьет запущенное приложение.

Если вы предпочитаете решение cmd, которое будет вызывать PowerShell только для запуска процесса, а затем сохранять его PID в переменной:for /F %A in ('powershell -Command "(Start-Process -PassThru -FilePath 'notepad' -ArgumentList 'test.txt').Id"') do set PID=%A (при вызове из.bat/.cmd вы должны использовать %%A вместо %A). Затем вы можете использовать методы @BaliC для тайм-аута и taskkill /PID %PID% убить запущенное приложение.

В PowerShell это намного проще, чем в cmd, потому что для этого есть командлет .Вы можете запустить свое приложение вот так

      $timeout = 60
$job = sajb { yourprogram.exe }; if (-not ($job | wjb -T $timeout)) { spjb $job }

Но проще поместить его в функцию в профиле для повторного использования, запустивnotepad $PROFILEв PowerShell и вставьте этот фрагмент

      Function Invoke-WithTimeOut {
    Param (
        [int]$timeout,
        [scriptblock]$script
    )

    $job = Start-Job $script
    $done = $job | Wait-Job -TimeOut $timeout
    if (-not $done) { Stop-Job $job }
}

Затем вы сможете использовать его в любых сеансах PowerShell. Например, чтобы запуститьyourprogram.exeс таймаутом 40 секунд

      Invoke-WithTimeOut 40 { yourprogram.exe }

Это работает, даже если запущено несколько экземпляров одного и того же приложения, в отличие от других.taskkillрешения. Кроме того, он немедленно вернется, если команда завершится до истечения времени, поэтому вам не придется ждать все время.

Вы можете заменитьсдля лучшей производительности, но в обычных случаях они не имеют значения

Если cmd действительно необходим, вы можете вызвать его из командного файла.

      powershell -NoProfile -ExecutionPolicy Bypass -C "Invoke-WithTimeOut 40 { yourprogram.exe }"

Для Windows 10 (1607+) тоже есть родное решение

      ScriptRunner.exe -appvscript yourprogram "with" "args" -appvscriptrunnerparameters -wait -timeout=60

Если вы изменитеStart-Job/Start-ThreadJobиWait-JobкStart-ProcessиWait-Processтогда результат будет таким же, как решение ScriptRunner выше

Другие вопросы по тегам