2011-01-10 22 views
11

リモートサーバーに対してGet-EventLogを実行するpowershell関数を書きました。いくつかのサーバでは、これはちょうどハングアップしてタイムアウトしないようです。 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

あなたはそうのようなバックグラウンドジョブを使用してタイムアウトを実装できます。

FYI
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

Wait-Jobの後にStop-Jobが必要ですか?タイムアウトが切れると、ジョブは実行され続けます。 – x0n

+2

Sheesh、picky、picky。私はあなたがきれいにきれいにするためにそこに除去仕事をしたいと思う。 :-) –

+1

ああ静かである!それでも、私からアップアップしてくれました;) – x0n

3

- あなたは、ArgumentListは、一つのパラメータのための唯一の良いです。 ジョブに複数の引数を渡したい場合は、配列として渡す方法があります:

$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

これは、一時停止しながら、ダウンカウントが表示されます(これはセミコロン)は1つのライナーですタイムアウトコマンドと同じ(同じではありません)

$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) 
関連する問題