Код возврата команды "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?
Есть ли другой способ разрешить это?
Ответы
Ответ 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