Comment capturer la valeur de retour d'un ScriptBlock invoqué avec la commande Invoke-Command de Powershell

ma question est très similaire à celle-ci , sauf que j'essaie de capturer le code de retour d'un ScriptBlock en utilisant Invoke-Command (donc je ne peux pas utiliser L'option-FilePath). Voici mon code:

Invoke-Command -computername $server {fileserverscript.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

le problème est que la commande Invoke-Command ne capture pas le code de retour du script.cmd, donc je n'ai aucun moyen de savoir s'il a échoué ou non. J'ai besoin d'être en mesure de savoir si le script.le cmd a échoué.

j'ai essayé D'utiliser un nouveau-PSSession (ce qui me permet de voir le script.le code de retour de cmd sur le serveur distant) mais je ne peux trouver aucun moyen de le transmettre à mon script D'appel Powershell pour réellement faire quoi que ce soit à propos de l'échec.

28
demandé sur Community 2011-12-18 05:18:40

4 réponses

$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
  1. créer une nouvelle session en utilisant new-pssession
  2. invoquez votre scripblock dans cette session
  3. Extraire le lastexitcode de cette session
37
répondu jon Z 2011-12-18 08:51:10
$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

de l'Hôte : HOST1

Output: ping request n'a pas pu trouver host badhostname. Veuillez vérifier le nom et essayez à nouveau", 151920920"
ExitCode : 1

de l'Hôte : HOST2

Output: ping request n'a pas pu trouver host badhostname. Veuillez vérifier le nom et essayez à nouveau.

ExitCode : 1

4
répondu Matthew MacFarland 2016-05-04 21:07:47

la réponse de @Jon Z est bonne, mais c'est plus simple:

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}

bien sûr, si votre commande produit une sortie, vous devrez la supprimer ou l'analyser pour obtenir le code de sortie, auquel cas la réponse de @jon Z pourrait être meilleure.

1
répondu jimhark 2015-09-16 20:03:23

j'ai utilisé une autre méthode récemment pour résoudre ce problème. Les différentes sorties qui proviennent du script tournant sur l'ordinateur distant sont un tableau.

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

la variable $result contiendra un tableau du message de sortie ping et le $lastexitcode . Si le code de sortie du script distant est sorti en dernier alors il peut être récupéré à partir du résultat complet sans parsing.

pour obtenir le reste de la sortie avant le code de sortie c'est juste:

$result | Select-Object -First $(result.Count-1)

0
répondu Matthew MacFarland 2018-05-05 18:39:09