26

La mia domanda è molto simile a this one, ad eccezione del fatto che sto cercando di acquisire il codice di ritorno di ScriptBlock usando Invoke-Command (quindi non posso usare l'opzione -FilePath). Qui è il mio codice:Come acquisire il valore di ritorno di uno scriptBlock invocato con Inowerske Command di Powershell

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args 
exit $LASTEXITCODE 

Il problema è che Invoke-Command non cattura il codice di ritorno di script.cmd, quindi non ho modo di sapere se non è riuscito o meno. Devo essere in grado di sapere se script.cmd non è riuscito.

Ho provato a utilizzare anche una New-PSSession (che mi consente di vedere il codice di ritorno di script.cmd sul server remoto) ma non riesco a trovare alcun modo per restituirlo allo script Powershell che chiama per fare effettivamente qualcosa il fallimento.

risposta

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. creare una nuova sessione utilizzando New-PSSession
  2. Richiamare il tuo scripblock in questa sessione
  3. Fetch il lastexitcode da questa sessione
+0

Questo ha funzionato. Non sapevo che potevi passare variabili remote da una sessione allo script locale del genere. Grazie! –

+6

Non '$ remotelastexitcode = invoke-command -ScriptBlock {cmd/c exit 2; $ lastexitcode} -Session $ remotesession' lavoro? Dal momento che stai usando le sessioni per dare più comandi, probabilmente puoi evitarlo. – manojlds

+2

@manojlds sì, anche l'acquisizione di lastexitcode nel primo scriptblock funzionerà. –

1

risposta @ Jon Z è buona, ma questo è più semplice:

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock { 
    cmd /c exit 2; $lastexitcode} 

Naturalmente se il tuo comando produce output dovrai sopprimerlo o analizzarlo per ottenere il codice di uscita, nel qual caso la risposta di @jon Z potrebbe essere migliore.

+0

Questo non funziona – ajgreyling

+0

@ajgreyling, non è un sacco di informazioni. Spiacente, questo non sembra funzionare per te. Cosa stai vedendo esattamente? La risposta di JonZ funziona per te? Ho appena ripeterlo e funziona per me su PS Ver 4 e 5. Non ho la versione 3 disponibile, ma cercherò di trovare altre versioni. – 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 

Host: HOST1
uscita: richiesta di rumore metallico non ha potuto trovare badhostname host. Si prega di verificare il nome e riprovare
ExitCode: 1

Host: HOST2
uscita: richiesta di rumore metallico non ha potuto trovare badhostname host. Per favore, controlla il nome e prova di nuovo.
ExitCode: 1

Problemi correlati