attraper le code de retour d'une commande avec "invoke-command" - Powershell 2

j'utilise" invoke-command " pour exécuter un script sur une machine distante.

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

mon script retourne " -1 " quand il y a des erreurs. Donc, je voulais m'assurer que script a exécuté avec succès en vérifiant le code de retour.

j'ai essayé comme suit.

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

mais ça ne rapporte rien.

N'est pas Invoke-command capturer le code de retour de bloc de script?

est là autre façon de résoudre ce problème?

15
demandé sur Ruben Bartelink 2009-07-31 10:23:56

6 réponses

je pense que si vous exécutez une commande de cette façon sur un autre serveur, il n'y a aucun moyen d'obtenir le code de retour de votre script. Cela est dû au fait que Invoke-Command exécute simplement une commande sur la machine distante, probablement au cours d'une seule session temporaire et vous ne pouvez pas vous connecter à cette session à nouveau.

Ce que vous peut faire, cependant, est de créer une session sur l'ordinateur distant et d'appeler votre script à l'intérieur de cette session. Après vous pouvez juste vérifiez à nouveau la valeur de retour dans cette session. Donc quelque chose dans le genre de:

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

pourrait marcher. De cette façon, vous avez accès au même état et aux mêmes variables que le premier Invoke-Command sur la machine distante.

aussi Invoke-Command est très peu probable de passer par la valeur de retour de la commande à distance. Comment avez-vous découvert que Invoke-Command a échoué?

ETA: Ok, I vous avez mal interprété le "code de retour". Je suppose que vous voulez dire $? . De toute façon, selon la documentation, vous pouvez exécuter un script sur un ordinateur distant comme suit:

pour exécuter un script local sur des ordinateurs distants, utilisez le FilePath paramètre de Invoke-Command .

par exemple, la commande suivante exécute le script Sample.ps1 sur les ordinateurs S1 et S2 :

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

Les résultats du script sont retournés à l'ordinateur local. Vous n'avez pas besoin de copier tous les fichiers.

10
répondu Joey 2011-03-10 20:19:41

voici un exemple...

script à Distance:

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

script Local:

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"

donc, - UseSSL et $ mycreds ne sont pas nécessaires si vous êtes pleinement dans un groupe de confiance. Cela semble fonctionner pour moi... bonne chance!

3
répondu Iain Ballard 2010-09-08 11:16:12

si un scriptblock distant renvoie un code de sortie, la psession sera fermée. Je vérifie juste l'état de la psession. S'il est fermé je suppose une erreur. Un peu hacky, mais ça marche pour mes objectifs.

$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
3
répondu Cirem 2014-06-24 15:27:33

je cherchais à saisir le retour du code d'erreur par un script de lot appelé via invoke-command. Pas une tâche facile, mais j'ai trouvé un joli et facile à faire.

vous script PowerShell est $res=invoke-command -Computername %computer% {C:\TEST\BATCH.CMD} write-host $res Vous découvrirez que $res est la sortie de lot, sachant cela en utilisant @echo off, > nul et echo "ce que vous voulez retourner" est possible!

vous script de lot

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

Maintenant, $res sera = 2! Ensuite, vous pouvez appliquer logique dans votre fournée.

vous pouvez même utiliser invoke-command-AsJob Utilisez Receive-job pour obtenir la sortie! Dans ce cas, vous n'avez pas besoin d'utiliser $res.

santé, Julien

0
répondu Julien 2016-01-26 16:47:31

si vous avez besoin de la sortie du bloc de script et le code de sortie, vous pouvez jeter le code de sortie du bloc et convertir si de nouveau dans un entier du côté appelant.

$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"
}

renvoie le standard et le dernier code de sortie. Cela nécessite cependant que dans votre bloc de script, toutes les exceptions soient capturées et rejouées en tant que codes de sortie. Sortie à partir de l'exemple ...

This is output that should not be lost
$exceptionExit = 99
0
répondu Jules Clements 2017-05-21 21:23:16

la dernière commande PowerShell Invoke-ci-dessous renvoie boolean True si le code d'erreur est zéro du script exécuté et boolean False si le code de retour est non-zéro. Fonctionne très bien pour détecter les codes d'erreur retournés à partir d'exécutions à distance.

function executeScriptBlock($scriptString) {

    Write-Host "executeScriptBlock($scriptString) - ENTRY"

    $scriptBlock = [scriptblock]::Create($scriptString + " `n " + "return `$LASTEXITCODE")

    Invoke-Command -Session $session -ScriptBlock $scriptBlock

    $rtnCode = Invoke-Command -Session $session -ScriptBlock { $? }

    if (!$rtnCode) {
        Write-Host "executeScriptBlock - FAILED"
    }
    Else {
        Write-Host "executeScriptBlock - SUCCESSFUL"
    }
}
0
répondu Jared 2018-05-14 14:58:58