2012-02-09 10 views
6

Soy nuevo en powershell, pero estoy tratando de generar un registro simple en un ps que estoy escribiendo para crear tareas programadas. Mi código está abajo. Parece que no lanza una excepción cuando obtienes un error con schtasks. Otra pregunta de SO mencionó esto con las acciones de fileIO y sugirió hacer "-ea stop" pero eso no funciona con schtasks.try-catch-fail con powershell y 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 "" 
    } 
} 

comprobé que 'Add-Content -path '\ ServerName! Entrante \ Distribución \ log.txt' -valor 'prueba'' obras, por lo que como he dicho estoy bastante seguro de que no está lanzando una excepción.

+0

Disculpa, esto fue hace mucho tiempo. Mi trabajo cambió significativamente en marzo, así que ni siquiera estoy seguro de haber terminado esto. Aunque pasaré un poco de tiempo tratando de encontrarlo para ti. –

+0

Gracias, sería genial obtener el código fuente completo de muestra trabajando. – Kiquenet

Respuesta

9

Para que un Try/Catch funcione, PowerShell necesita una excepción de terminación. Cuando ejecuta un cmdlet en un bloque Try, puede hacerlo mediante el uso de -erroraction Stop (o use el alias -ea). Como ya sabe, SCHTASKS.EXE no puede hacer esto. Sin una excepción de terminación, el código en el bloque Catch nunca se ejecutará.

Lo que tienes que hacer es salir de la caja, por así decirlo, y comprobar de forma independiente si Schtasks ha fallado. Si es así, pueden usar Write-Error en su bloque Try.

Una cosa que podría intentar es utilizar Start-Process y ver el código de salida. Cualquier cosa que no sea 0 debería ser un error.

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 
}