start - powershell scripts
Cómo capturar el valor de retorno de un ScriptBlock invocado con el comando invocación de Powershell (4)
Mi pregunta es muy similar a esta , excepto que estoy tratando de capturar el código de retorno de un ScriptBlock usando Invoke-Command (así que no puedo usar la opción -FilePath). Aquí está mi código:
Invoke-Command -computername $server {//fileserver/script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE
El problema es que Invoke-Command no captura el código de retorno de script.cmd, por lo que no tengo forma de saber si falló o no. Necesito poder saber si script.cmd falló.
Traté de usar una New-PSSession también (lo que me permite ver el código de retorno de script.cmd en el servidor remoto) pero no puedo encontrar la manera de devolverlo a mi script de Powershell para hacer algo acerca de la falla.
He estado usando otro método últimamente para resolver este problema. Los diversos resultados que provienen del script que se ejecuta en la computadora remota son una matriz.
$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
ping BADHOSTNAME
$lastexitcode
}
exit $result | Select-Object -Last 1
La variable $result
contendrá una matriz del mensaje de salida de ping y $lastexitcode
. Si el código de salida de la secuencia de comandos remota se emite por última vez, se puede recuperar desde el resultado completo sin analizar.
Para obtener el resto de la salida antes del código de salida es solo:
$result | Select-Object -First $(result.Count-1)
La respuesta de @jon Z es buena, pero esto es más simple:
$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
cmd /c exit 2; $lastexitcode}
Por supuesto, si su comando produce salida, tendrá que suprimirlo o analizarlo para obtener el código de salida, en cuyo caso la respuesta de @jon Z puede ser mejor.
$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
- Crea una nueva sesión usando new-pssession
- Invoca tu scripblock en esta sesión
- Obtener el lastexitcode de esta sesión
$script = {
# Call exe and combine all output streams so nothing is missed
$output = ping badhostname *>&1
# Save lastexitcode right after call to exe completes
$exitCode = $LASTEXITCODE
# Return the output and the exitcode using a hashtable
New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}
# Capture the results from the remote computers
$results = Invoke-Command -ComputerName host1, host2 -ScriptBlock $script
$results | select Host, Output, ExitCode | Format-List
Anfitrión: HOST1
Salida: la solicitud de ping no pudo encontrar el host nombrehosthost. Por favor revisa el nombre y prueba de nuevo
ExitCode: 1
Anfitrión: HOST2
Salida: la solicitud de ping no pudo encontrar el host nombrehosthost. Por favor revisa el nombre y prueba de nuevo.
ExitCode: 1