在linux上,有timeout
命令,它有一个非常好的简单语法:
timeout 120 command [args]
很简单。它运行命令并在命令超过时间限制时终止它。尽管我尽了最大的努力,"解决方案"在Windows上是多行,不要向终端显示命令的输出,并且cygwin"超时"如果我将超时增加到超过一分钟(我没有解释),则无法终止进程。有没有人有更好的主意?
答案 0 :(得分:3)
我的意思是timeout.exe
,但我认为这不会为您提供与您正在寻找的功能完全相同的功能。
我不知道Windows的timeout
等价物。根据{{3}} PowerShell作业中的建议,将建议如何复制timeout
的行为。我推出了一个简单的示例函数
function timeout{
param(
[int]$Seconds,
[scriptblock]$Scriptblock,
[string[]]$Arguments
)
# Get a time stamp of before we run the job
$now = Get-Date
# Execute the scriptblock as a job
$theJob = Start-Job -Name Timeout -ScriptBlock $Scriptblock -ArgumentList $Arguments
while($theJob.State -eq "Running"){
# Display any output gathered so far.
$theJob | Receive-Job
# Check if we have exceeded the timeout.
if(((Get-Date) - $now).TotalSeconds -gt $Seconds){
Write-Warning "Task has exceeded it allotted running time of $Seconds second(s)."
Remove-Job -Job $theJob -Force
}
}
# Job has completed natually
$theJob | Remove-Job -ErrorAction SilentlyContinue
}
这会启动作业并不断检查其输出。因此,您应该接近正在运行的进程的实时更新。您不必使用-ScriptBlock
,也可以选择基于-Command
的作业。我将使用上面的函数和一个脚本块来展示一个例子。
timeout 5 {param($e,$o)1..10|ForEach-Object{if($_%2){"$_`: $e"}else{"$_`: $o"};sleep -Seconds 1}} "OdD","eVeN"
这将打印数字1到10以及数字均匀度。在显示数字之间会有1秒的暂停。如果超时,则显示警告。在上面的例子中,由于该过程仅允许5秒,因此不会显示所有10个数字。
功能可以使用一些修饰,并且可能有人可能已经完成此操作。我至少接受它。