26

Mi pregunta es muy similar a this one, excepto que estoy tratando de capturar el código de retorno de un ScriptBlock usando Invoke-Command (entonces no puedo usar la opción -FilePath). Aquí está mi código:Cómo capturar el valor de retorno de un ScriptBlock invocado con el Invoke-Command de Powershell

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, así que no tengo forma de saber si falló o no. Necesito poder saber si script.cmd falló.

Intenté utilizar una New-PSSession también (lo que me permite ver el código de retorno de script.cmd en el servidor remoto) pero no encuentro ninguna forma de devolverlo a mi script de Powershell para hacer algo acerca de la falla.

Respuesta

36
$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 
  1. crear una nueva sesión utilizando las nuevas-pssession
  2. invocan tu scripblock en esta sesión
  3. Fetch la lastexitcode de esta sesión
+0

Esto funcionó. No sabía que podía pasar variables remotas de una sesión al script local de esa manera. ¡Gracias! –

+6

No '$ remotelastexitcode = invoke-command -ScriptBlock {cmd/c exit 2; $ lastexitcode} -Sesión $ remotesession' work? Como está usando las sesiones para dar múltiples comandos, probablemente pueda evitar eso. – manojlds

+2

@manojlds sí, la captura de lastexitcode en el primer scriptblock también funcionará. –

1

respuesta @ Jon Z es bueno, 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.

+0

Esto no funciona – ajgreyling

+0

@ajgreyling, eso no es mucha información. Lo siento, esto no parece funcionar para usted. ¿Qué estás viendo exactamente? ¿La respuesta de JonZ funciona para usted? Acabo de volver a probar y funciona para mí en PS Ver 4 y 5. No tengo Ver 3 fácilmente disponible, pero intentaré encontrar otras versiones. – jimhark

3
$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: Solicitud de ping no pudo encontrar badhostname anfitrión. Compruebe el nombre y vuelva a intentarlo
ExitCode: 1

Anfitrión: HOST2
Salida: Solicitud de ping no pudo encontrar badhostname anfitrión. Por favor revisa el nombre y prueba de nuevo.
ExitCode: 1

Cuestiones relacionadas