2011-01-10 40 views
11

Tôi đã viết một chức năng powershell nhỏ thực hiện Get-EventLog chống lại các máy chủ từ xa. Trên một số máy chủ, điều này dường như chỉ treo và không bao giờ hết giờ. Tôi có thể timeout một cuộc gọi chức năng powershell? Tôi thấy làm thế nào để làm điều này chống lại một different process, nhưng tôi muốn làm điều này cho một chức năng vỏ điện.Làm thế nào để timeout chức năng PowerShell gọi

nhờ

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

Trả lời

24

Bạn có thể thực hiện bằng cách sử dụng timeout một công việc nền như vậy:

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

Anh ấy cần dừng công việc sau công việc chờ? Nếu thời gian chờ hết hạn, công việc vẫn tiếp tục chạy ... – x0n

+2

Sheesh, picky, picky. Tôi cho rằng bạn muốn có một công việc trong đó để dọn dẹp độc đáo. :-) –

+1

ahh yên lặng! Tuy nhiên, bạn đã nhận được sự ủng hộ từ tôi;) – x0n

3

FYI - argumentlist của bạn chỉ tốt cho một tham số. Nếu bạn muốn vượt qua nhiều hơn một đối số cho công việc, bạn phải vượt qua chúng như một mảng:

$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

Đây là một liner (do dấu chấm phẩy) sẽ hiển thị một đếm ngược khi tạm dừng tương tự (nhưng không giống nhau) như lệnh 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) 
Các vấn đề liên quan