2011-01-10 4 views
11

Napisałem małą funkcję PowerShell, która wykonuje Get-EventLog na zdalnych serwerach. Na niektórych serwerach wydaje się, że po prostu się zawiesił i nigdy nie wygasł. Czy mogę przerwać wywoływanie funkcji powershell? Widzę, jak to zrobić przeciwko different process, ale chcę to zrobić dla funkcji powłoki zasilania.Jak przerwać wywoływanie funkcji PowerShell

dzięki

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

Odpowiedz

24

można zaimplementować limity czasu pracy za pomocą tła tak:

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

Czy potrzebuje On-stop po wykonaniu Wait-Job? Jeśli upłynie limit czasu, zadanie będzie kontynuowane ... – x0n

+2

Sheesh, wybredny, wybredny. Przypuszczam, że chcesz tam też usunąć pracę, żeby się porządnie posprzątać. :-) –

+1

ahh bądź cicho! Mimo wszystko otrzymałeś ode mnie ode mnie;) – x0n

3

FYI - Twój argumentlist jest dobre tylko dla jednego parametru. Jeśli chcesz przekazać więcej niż jeden argument do pracy, trzeba przekazać je jako tablica:

$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

To jest jedna wkładka (ze względu na średnikami), które będą wyświetlane odliczanie podczas pauzy podobne (ale nie to samo) co polecenie 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)