Как захватить возвращаемое значение ScriptBlock, вызванное с помощью команды Powershell Invoke-Command
Мой вопрос очень похож на этот, за исключением того, что я пытаюсь захватить код возврата 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 script на самом деле Что-нибудь о сбое.
Ответы
Ответ 1
$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
- Вызовите свой скриптовый блок в этом сеансе
- Получить последний вывод из этого сеанса
Ответ 2
$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 не смог найти имя хоста badhost. Пожалуйста, проверьте имя и повторите попытку
ExitCode: 1
Хост: HOST2
Выход: запрос Ping не смог найти имя хоста badhost. Проверьте имя и повторите попытку.
ExitCode: 1
Ответ 3
@jon Z ответ хороший, но это проще:
$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
cmd /c exit 2; $lastexitcode}
Конечно, если ваша команда производит вывод, вам придется ее подавить или проанализировать, чтобы получить код выхода, и в этом случае ответ @jon Z может быть лучше.