web-dev-qa-db-fra.com

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

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

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

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

J'ai également essayé d'utiliser une New-PSSession (qui me permet de voir le code de retour de script.cmd sur le serveur distant) mais je ne trouve aucun moyen de le transmettre à mon script Powershell appelant pour réellement faire quoi que ce soit concernant l'échec.

29
Jay Spang
$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. Invoquer votre bloc de scripts dans cette session
  3. Récupérer le lastexitcode de cette session
39
jon Z
$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

Hôte: Host1
Sortie: la requête Ping n'a pas pu trouver le nom d'hôte incorrect. S'il vous plaît vérifier le nom et essayez à nouveau
ExitCode: 1

Hôte: Host2
Sortie: la requête Ping n'a pas pu trouver le nom d'hôte incorrect. S'il vous plaît vérifier le nom et essayez à nouveau.
ExitCode: 1

6

J'ai utilisé une autre méthode récemment pour résoudre ce problème. Les différentes sorties qui proviennent du script exécuté 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, il peut être récupéré à partir du résultat complet sans analyse.

Pour obtenir le reste de la sortie avant le code de sortie, il suffit de:
$result | Select-Object -First $(result.Count-1)

2

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
jimhark