2011-01-10 57 views
11

我写了一个小小的powershell函数,用于对远程服务器执行Get-EventLog。在某些服务器上,这似乎只是挂起而且从不超时。我可以超时PowerShell函数调用吗?我看到如何对different process这样做,但我想为一个电源外壳功能做到这一点。如何超时PowerShell函数调用

感谢

####################### 
function Get-Alert4 
{ 
    param($computer) 
    $ret = Get-EventLog application -after (get-date).addHours(-2) -computer $computer | select-string -inputobject{$_.message} -pattern "Some Error String" | select-object List 
    return $ret 
} # 

回答

24

您可以通过使用一个后台作业,像这样实现超时:

function Get-Alert4($computer, $timeout = 30) 
{ 
    $time = (Get-Date).AddHours(-2) 
    $job = Start-Job { param($c) Get-EventLog Application -CN $c -After $time | 
        Select-String "Some err string" -inputobject{$_.message} | 
        Select-Object List } -ArgumentList $computer 

    Wait-Job $job -Timeout $timeout 
    Stop-Job $job 
    Receive-Job $job 
    Remove-Job $job 
} 
+3

他是否需要停止,作业的等待作业后?如果超时过期,作业继续运行... – x0n 2011-01-10 21:20:24

3

仅供参考 - 你的参数列表只有一个参数不错。 如果要多个参数传递给工作,你必须将它们传递作为数组:

$job = Start-Job { param($c, $t) Get-EventLog Application -CN $c -After $t | 
        Select-String "Some err string" -inputobject{$_.message} | 
        Select-Object List } -ArgumentList @($computer, $time) 
0

这是一个内衬(由于分号),将显示一个倒计时,同时暂停类似(但不相同)作为超时cmd命令

$NumOfSecs = 15; $n = $NumOfSecs; write-host "Starting in " -NoNewLine; do {if($n -lt $NumOfSecs) {write-host ", " -NoNewLine}; write-host $n -NoNewLine; $n = $n - 1; Start-Sleep 1} while ($n -gt 0)