Как захватить возвращаемое значение ScriptBlock, вызываемого с помощью команды Invoke-Powershell

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

Invoke-Command -computername $server {fileserverscript.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

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

Я также попытался использовать новый-PSSession (что позволяет мне видеть скрипт.код возврата cmd на удаленном сервере), но я не могу найти способ передать его обратно в мой вызывающий сценарий Powershell, чтобы действительно что-то сделать с ошибкой.

4 ответов


$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. вызовите свой scripblock в этом сеансе
  3. извлеките lastexitcode из этого сеанса

$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

хост: ХОСТ1
Вывод: запрос Ping не смог найти имя хоста badhostname. Пожалуйста, проверьте имя и повторите попытку
Exitcode содержит : 1

хост: HOST2
Вывод: запрос Ping не смог найти имя хоста badhostname. Пожалуйста, проверьте имя и повторите попытку.
Exitcode содержит : 1


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

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

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


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

$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)