Как получить возвращаемое значение ScriptBlock, вызванного с помощью команды Invoke-команды Powershell - PullRequest
29 голосов
/ 18 декабря 2011

Мой вопрос очень похож на этот , за исключением того, что я пытаюсь перехватить код возврата ScriptBlock с помощью Invoke-Command (поэтому я не могу использовать опцию -FilePath). Вот мой код:

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

Проблема в том, что Invoke-Command не захватывает код возврата script.cmd, поэтому у меня нет возможности узнать, не удалось это или нет. Мне нужно знать, не удалось ли script.cmd.

Я также пытался использовать New-PSSession (который позволяет мне видеть код возврата script.cmd на удаленном сервере), но я не могу найти способ передать его обратно в мой вызывающий скрипт Powershell, чтобы фактически ДЕЙСТВОВАТЬ о отказ.

Ответы [ 4 ]

39 голосов
/ 18 декабря 2011
$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. Создание нового сеанса с помощью new-pssession
  2. Вызовите свой скрипт-блок в этом сеансе
  3. Получить код lastexit из этого сеанса
6 голосов
/ 04 мая 2016
$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

Хост: HOST1
Вывод: в результате запроса Ping не удалось найти имя хоста.Пожалуйста, проверьте имя и попробуйте снова
ExitCode: 1

Хост: HOST2
Вывод: Ping-запрос не смог найти имя хоста hosthostПожалуйста, проверьте имя и попробуйте снова.
ExitCode: 1

2 голосов
/ 05 мая 2018

В последнее время я использовал другой метод для решения этой проблемы.Различные выходные данные, полученные из скрипта, запущенного на удаленном компьютере, представляют собой массив.

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

Переменная $result будет содержать массив сообщения вывода ping и $lastexitcode.Если код выхода из удаленного сценария выводится последним, его можно получить из полного результата без разбора.

Чтобы получить оставшуюся часть вывода перед кодом выхода, это просто:
$result | Select-Object -First $(result.Count-1)

1 голос
/ 16 сентября 2015

@ jon Z ответ хорош, но это проще:

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

Конечно, если ваша команда выдает выходные данные, вам придется ее подавить или проанализировать, чтобы получить код выхода, и в этом случае ответ @jon Z может быть лучше.

...