超时相当于Windows

时间:2017-09-23 00:38:36

标签: windows powershell batch-file

在linux上,有timeout命令,它有一个非常好的简单语法:

timeout 120 command [args]

很简单。它运行命令并在命令超过时间限制时终止它。尽管我尽了最大的努力,"解决方案"在Windows上是多行,不要向终端显示命令的输出,并且cygwin"超时"如果我将超时增加到超过一分钟(我没有解释),则无法终止进程。有没有人有更好的主意?

1 个答案:

答案 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个数字。

功能可以使用一些修饰,并且可能有人可能已经完成此操作。我至少接受它。