我该如何限制 Windows 中命令行程序的执行时间?我知道 Linux 中有timeout
/timelimit
可用,但我找不到适用于 Windows 的类似实用程序。
答案1
start yourprogram.exe
ping 127.0.0.1 -n 10
taskkill /im yourprogram.exe
如果您将其放入记事本并保存,.bat
它将创建一个执行此操作的批处理文件。
我以 10 秒为例,只需根据您的需要进行调整即可。
另外,如果你使用的是 Vista 或更高版本,你可以删除该ping
行并使用更简单的timeout
命令代替它
timeout /t 10
答案2
据我所知,似乎不存在这样的功能,但我认为如果您通过任务计划程序使其作为 Windows 任务运行,它是可行的,从那里您可以设置执行限制,设置名称如下:如果任务运行时间超过以下时间则停止任务:,你可以从这里获得更多详细信息:http://technet.microsoft.com/en-us/library/cc722178.aspx
答案3
如果您不介意使用 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%
终止已启动的应用程序。
答案4
在 PowerShell 中比在 cmd 中更容易,因为有一个Wait-Job
命令为此。你可以像这样运行你的应用程序
$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
。此外,如果命令在超时之前退出,它会立即返回,因此您不必等待整个时间
您可以更换Start-Job
和Start-ThreadJob
以获得更好的性能,但在正常情况下,它们并没有什么区别
如果确实需要 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 解决方案相同