2012-02-09 6 views
6

Sono nuovo di PowerShell, ma sto cercando di uscita qualche semplice registrazione in un ps sto scrivendo per creare le operazioni pianificate. Il mio codice è sotto Sembra che non generi un'eccezione quando si verifica un errore con schtasks. Un'altra domanda SO lo ha menzionato con azioni fileIO e ha suggerito di fare "-ea stop", ma questo non funziona con gli schtasks.try-catch-fail con PowerShell e Schtasks

#create log file 
$log = "\\servername\!incoming\Deploy\log.txt" 
Clear-Content $log 

#get input file list 
$txtServerList = Gc "\\servername\!incoming\Deploy\serverlist.txt" 
#loop through each server 
ForEach($strServername In $txtServerList) 
{ 
    try 
    { 
     #install task from XML template 
     schtasks /create /s $strServername /tn InventoryServer /XML "\\servername\!incoming\Deploy\TaskTemplate.xml" 
     #run the task immediately 
     schtasks /run /s $strServername /tn InventoryServer 
    } 
    catch [exception] 
    { 
     Add-Content -path $log -value $strServername 
     #Add-Content -path $log -value $_.Exception 
     #Add-Content -path $log -value $_.Exception.Message 
     #Add-Content -path $log -value "" 
    } 
} 

ho verificato che 'Add-Content -path '\ servername! Entrante \ Deploy \ log.txt' valore 'test'' opere, così come ho detto sono abbastanza sicuro che non è solo buttare un eccezione.

+0

Siamo spiacenti, questo è stato un mooolto di tempo fa. Il mio lavoro è notevolmente cambiato a marzo, quindi non sono nemmeno sicuro di averlo mai fatto. Passerò un po 'di tempo a cercare di trovarlo per te. –

+0

Grazie, sarebbe bello ottenere il codice sorgente di esempio di lavoro. – Kiquenet

risposta

9

Al fine di un try/catch per lavorare, ha bisogno di PowerShell un'eccezione di terminazione. Quando si esegue un cmdlet in un blocco try si può fare che accade utilizzando -ErrorAction Stop (o utilizzare l'alias -ea). Come già sapete, SCHTASKS.EXE non può farlo. Senza un'eccezione di terminazione, il codice nel blocco Catch non verrà mai eseguito.

Quello che devi fare è un passo fuori dal lato della scatola, per così dire, e indipendentemente verificare se Schtasks fallito. In tal caso, è possibile utilizzare Write-Error nel blocco Try.

Una cosa che si potrebbe provare sta usando avvio del processo e guardare il codice di uscita. Qualsiasi cosa diversa da 0 dovrebbe essere un errore.

Try { 
get-date 
$p=Start-Process schtasks.exe -ArgumentList "/Create foo" -wait -passthru 
if ($p.exitcode -ne 0) { 
    write-error "I failed with error $($p.exitcode)" 
} 
} 

Catch { 
"oops" 
$_.Exception 
}