Подтвердить что ты не робот

Как захватить возвращаемое значение 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 на самом деле Что-нибудь о сбое.

4b9b3361

Ответ 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 может быть лучше.