26

Moje pytanie jest bardzo podobne do this one, z tą różnicą, że próbuję przechwycić kod powrotu skryptu blokującego za pomocą polecenia Invoke-Command (nie mogę więc użyć opcja -FilePath). Oto mój kod:Jak przechwycić wartość zwracaną blokady ScriptBlocka za pomocą polecenia Inwokacja Powershell'a

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

Problemem jest to, że Invoke-Command nie uchwycić kodu powrotu script.cmd, więc nie mam pojęcia, czy to nie udało, czy nie. Muszę wiedzieć, czy skrypt script.cmd nie działa.

Próbowałem również używać New-PSSession (co pozwala mi zobaczyć kod powrotu script.cmd na serwerze zdalnym), ale nie mogę znaleźć sposobu, aby przekazać go do mojego wywoływania skryptu Powershell, aby faktycznie Cokolwiek zrobić awaria.

Odpowiedz

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. Tworzenie nowej sesji za pomocą nowego-PSSession
  2. Przywołaj swoje scripblock w tej sesji
  3. Przynieś lastexitcode z tej sesji
+0

To zadziałało. Nie wiedziałem, że można przekazywać zmienne zdalne z sesji z powrotem do lokalnego skryptu w ten sposób. Dzięki! –

+6

Nie '$ remotelastexitcode = invoke-command -ScriptBlock {cmd/c exit 2; $ lastexitcode} -Session $ remotesession' działa? Ponieważ używasz sesji do wydawania wielu poleceń, prawdopodobnie możesz temu zapobiec. – manojlds

+2

@manojlds tak, będzie również działać przechwytywanie ostatniego wywołania w pierwszym bloku skryptu. –

1

@jon Z. odpowiedź jest dobra, ale to jest prostsze:

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

Oczywiście, jeśli twoje polecenie generuje wyjście, musisz je ukryć lub przeanalizować, aby uzyskać kod wyjścia, w takim przypadku odpowiedź @jon Z może być lepsza.

+0

To nie działa – ajgreyling

+0

@ajgreyling, to nie jest dużo informacji. Przepraszamy, to nie działa dla Ciebie. Co dokładnie widzisz? Czy odpowiedź Jonza działa dla ciebie? Właśnie przetestowałem i działa to dla mnie na PS Ver 4 i 5. Nie mam Ver 3 łatwo dostępnego, ale spróbuję znaleźć inne wersje. – 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
wyjściowa: Żądanie polecenia ping nie może znaleźć hosta badhostname. Proszę sprawdzić nazwę i spróbuj ponownie
exitCode: 1

Host: HOST2
wyjściowa: Żądanie polecenia ping nie może znaleźć hosta badhostname. Sprawdź nazwę i spróbuj ponownie.
Kod Wyjścia: 1

Powiązane problemy