2011-01-10 72 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)