Ограничение времени командной строки 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 выше