Как захватить возвращаемое значение 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
- создайте новый сеанс с помощью new-pssession
- вызовите свой scripblock в этом сеансе
- извлеките 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)