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.
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
- créer une nouvelle session en utilisant new-pssession
- invoquez votre scripblock dans cette session
- Extraire le lastexitcode de cette session
$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
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.
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)