L'obtention de ExitCode l'aide de Start-Processus et WaitForExit au lieu d'Attendre
Je suis en train de lancer un programme à partir de PowerShell, attendez la sortie, puis obtenir l'accès à la ExitCode, mais je ne suis pas du avoir beaucoup de chance. Je ne veux pas utiliser -Wait
avec Start-Processus
, comme j'ai besoin de quelques traitement à effectuer en arrière-plan.
Ici est simplifié script de test:
cd "C:\Windows"
# ExitCode is available when using -Wait...
Write-Host "Starting Notepad with -Wait - return code will be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru -Wait)
Write-Host "Process finished with return code: " $process.ExitCode
# ExitCode is not available when waiting separately
Write-Host "Starting Notepad without -Wait - return code will NOT be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru)
$process.WaitForExit()
Write-Host "Process exit code should be here: " $process.ExitCode
L'exécution de ce script va provoquer Le bloc-notes à être démarré. Après c'est fermé manuellement, le code de sortie sera imprimé, et il va commencer à nouveau, sans l'aide de -wait
. Pas de ExitCode est fourni lorsque c'est quit:
Starting Notepad with -Wait - return code will be available
Process finished with return code: 0
Starting Notepad without -Wait - return code will NOT be available
Process exit code should be here:
J'ai besoin d'être en mesure d'effectuer un traitement supplémentaire entre le point de départ du programme et en attente pour elle de cesser de fumer, alors je ne peux pas faire usage de -Wait
. Comment puis-je le faire et d'avoir encore accès à l' .ExitCode propriété de ce processus?
Vous devez vous connecter pour publier un commentaire.
Deux choses que vous pourriez faire je pense...
Voici comment vous pouvez le faire soit:
OU
Il y a deux choses à retenir ici. L'un est d'ajouter la
-PassThru
argument et de deux, c'est pour ajouter de la-Wait
argument. Vous devez ajouter l'attente argument, en raison de ce défaut: http://connect.microsoft.com/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-propertyUne fois que vous faites cela un processus objet est passé en arrière et vous pouvez regarder le ExitCode propriété de cet objet. Voici un exemple:
Si vous l'exécuter sans
-PassThru
ou-Wait
, il affichera rien.La même réponse est ici: Comment puis-je exécuter un programme d'installation de Windows et d'obtenir un réussir/échec de la valeur dans PowerShell?
Tout en essayant de la finale de la suggestion ci-dessus, j'ai découvert une même solution plus simple. Tout ce que j'avais à faire était de cache de la poignée de processus. Dès que je l'ai fait, $processus.ExitCode a fonctionné correctement. Si je n'ai pas le cache de la poignée de processus, $processus.ExitCode était nulle.
exemple:
L' 'Wait' option semblait bloquer pour moi, même si mon processus soit terminé.
J'ai essayé Adrian solution et ça fonctionne. Mais j'ai utilisé Wait-Processus au lieu de compter sur un effet secondaire de récupérer le handle de processus.
Donc:
$proc.HasExited
n'est pas fiable non plus. J'ai eu plusieurs cas où il serait par intermittence être coincé lors de l'attente pour cette valeur à devenir de véritables quand être l'aide d'un tout en boucle. Je ne connaissais pasWait-Process
mais cela semble faire beaucoup mieux. Merci, @tlbOu essayer d'ajouter cette...
En utilisant ce code, vous pouvez le laisser PowerShell s'occuper de la gestion redirigé sortie/erreur de flux, vous ne pouvez pas le faire en utilisant le Système.Diagnostics.Processus.Start() directement.
($process.Handle)
après le début du processus avecStart-Process
. Il ne sera pas plus défini après la sortie du processus.