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

Код возврата команды "invoke-command" - Powershell 2

Я использую команду "invoke-command" для выполнения script на удаленном компьютере.

invoke-command -computername <server_name> -scriptblock {command to execute the script}

My script возвращает "-1" при возникновении ошибок. Итак, я хотел убедиться, что script выполнил успешно, проверив код возврата.

Я попытался сделать следующее.

$code = invoke-command -computername ....

Но он ничего не возвращает.

Не Invoke-command улавливает код возврата блока script?

Есть ли другой способ разрешить это?

4b9b3361

Ответ 1

Я думаю, что если вы запустите команду на другом сервере, вы не сможете получить код возврата вашего script. Это связано с тем, что Invoke-Command просто запускает одну команду на удаленном компьютере, возможно, в течение одного временного сеанса, и вы не можете снова подключиться к этому сеансу.

Однако вы можете создать сеанс на удаленном компьютере и вызвать script в этом сеансе. После этого вы можете снова проверить возвращаемое значение в этом сеансе. Итак, что-то вроде:

$s = New-PSSession -ComputerName <server_name>
Invoke-Command -Session $s -ScriptBlock { ... }
Invoke-Command -Session $s -ScriptBlock { $? }

может работать. Таким образом, вы получаете доступ к тому же состоянию и переменным, что и первый Invoke-Command на удаленной машине.

Также Invoke-Command вряд ли пройдет через возвращаемое значение удаленной команды. Как бы вы выяснили, что сам Invoke-Command не удалось?

ETA: Хорошо, я неправильно понял вас в отношении "кода возврата". Я предполагал, что вы имели в виду $?. В любом случае, согласно документации, вы можете запустить script на удаленном компьютере следующим образом:

Чтобы запустить локальный script на удаленных компьютерах, используйте FilePath параметра Invoke-Command.

Например, следующая команда запускает Sample.ps1 scriptна компьютерах S1 и S2:

invoke-command -computername S1, S2 -filepath C:\Test\Sample.ps1

Результаты script возвращаются на локальный компьютер. Вы не нужно копировать файлы.

Ответ 2

Вот пример...

Удаленный script:

try {
    ... go do stuff ...
} catch {
    return 1
    exit
}
return 2
exit

Локальный script:

function RunRemote {
    param ([string]$remoteIp, [string]$localScriptName)
    $res = Invoke-Command -computername $remoteIp -UseSSL -Credential $mycreds -SessionOption $so -FilePath $localScriptName
    return $res
}

$status = RunRemote $ip_name ".\Scripts\myRemoteScript.ps1"
echo "Return status was $status"

$so, -UseSSL и $mycreds не нужны, если вы полностью вошли в группу доверия. Кажется, это работает для меня... удачи!

Ответ 3

Если удаленный скриптовый блок возвращает код выхода, функция psession будет закрыта. Я просто проверяю состояние психики. Если он закрыт, я допускаю ошибку. Вид хаки, но он работает для моих целей.

$session = new-pssession $env:COMPUTERNAME
Invoke-Command -ScriptBlock {try { ErrorHere } Catch [system.exception] {exit 1}} -Session $session

if ($session.State -eq "Closed")
{
    "Remote Script Errored out"
}

Remove-PSSession $session

$session = new-pssession $env:COMPUTERNAME
Invoke-Command -ScriptBlock {"no exitcodes here"} -Session $session

if ($session.State -ne "Closed")
{
    "Remote Script ran succesfully"
}

Remove-PSSession $session

Ответ 4

Я искал, чтобы вернуть код ошибки с помощью пакета script, вызванного командой invoke-command. Не легкая задача, но я нашел хороший и простой способ сделать это.

Вы PowerShell script $res=invoke-command -Computername %computer% {C:\TEST\BATCH.CMD} write-host $res Вы узнаете, что $res - это пакетный вывод, зная это, используя @echo off, > nul и echo "то, что вы хотите вернуть" возможно!

Вы загружаете script

@echo off
echo "Start Script, do not return" > nul
echo 2

Теперь $res будет = 2! Затем вы можете применить любую логику в своей партии.

Вы даже можете использовать команду invoke -AsJob Используйте Receive-job для получения результата! В этом случае вам не нужно использовать $res.

Cheers, Julien

Ответ 5

Если вам нужен вывод из script блока и кода выхода, вы можете вывести код выхода из блока и преобразовать, если обратно в целое число на вызывающей стороне.

$session = new-pssession $env:COMPUTERNAME
try {
    Invoke-Command -ScriptBlock {Write-Host "This is output that should not be lost"; $exitCode = 99; throw $exitCode} -Session $session
} catch {
    $exceptionExit = echo $_.tostring()
    [int]$exceptionExit = [convert]::ToInt32($exceptionExit)
    Write-Host "`$exceptionExit = $exceptionExit"
}

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

This is output that should not be lost
$exceptionExit = 99