如何超时PowerShell函数调用

时间:2011-01-10 20:00:33

标签: powershell powershell-v2.0

我写了一个小的powershell函数,它对远程服务器执行Get-EventLog。在某些服务器上,这似乎只是挂起,永远不会超时。我可以超时一个powershell函数调用吗?我看到如何针对different process执行此操作,但我想为power shell函数执行此操作。

感谢

#######################
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   
} #

3 个答案:

答案 0 :(得分:25)

您可以使用类似的后台作业实现超时:

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
}

答案 1 :(得分:4)

仅供参考 - 您的参数列表仅适用于一个参数。 如果要将多个参数传递给作业,则必须将它们作为数组传递:

  $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)

答案 2 :(得分:0)

这是一个单行(由于分号),它会显示倒计时,同时暂停与timeout 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)