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.
$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
$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
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)
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.