Comment dire PowerShell attendre pour chaque commande à la fin avant de commencer la prochaine?
-
20-09-2019 - |
Question
J'ai un script PowerShell 1.0 pour ouvrir un tas juste d'applications. La première est une machine virtuelle et les autres sont des applications de développement. Je veux la machine virtuelle pour terminer avant le démarrage du reste des applications sont ouvertes.
En bash je pouvais dire "cmd1 && cmd2"
est ce que j'ai ...
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
La solution
Normalement, pour les commandes internes PowerShell n'attend avant de démarrer la commande suivante. Une exception à cette règle est EXE à base de sous-système Windows externe. La première astuce est de pipeline à Out-Null
comme ceci:
Notepad.exe | Out-Null
PowerShell attendra jusqu'à ce que le processus Notepad.exe a été sorti avant de continuer. C'est chouette mais un peu subtile pour ramasser à la lecture du code. Vous pouvez également utiliser Start-process avec le paramètre -Attendre:
Start-Process <path to exe> -NoNewWindow -Wait
Si vous utilisez la version Community Extensions PowerShell est:
$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()
Une autre option dans PowerShell 2.0 est d'utiliser une tâche d'arrière-plan:
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
Autres conseils
En plus d'utiliser Start-Process -Wait
, redirigeant la sortie d'un exécutable fera Powershell attendre. En fonction des besoins, je vais généralement conduit à Out-Null
, Out-Default
, Out-String
ou Out-String -Stream
. est une longue liste d'autres options de sortie.
# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String
# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }
# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com
Je ne manquez pas les opérateurs de style CMD / Bash que vous REFERENCEE (&, &&, ||). Il semble que nous devons être plus bavard avec Powershell.
Il suffit d'utiliser "Attendez-process":
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
travail est fait
Si vous utilisez Start-Process <path to exe> -NoNewWindow -Wait
Vous pouvez également utiliser l'option -PassThru
faire écho à la sortie.
Certains programmes ne peuvent pas traiter le flux de sortie très bien, à l'aide de tuyaux Out-Null
ne peut pas bloquer.
Et Start-Process
a besoin de l'interrupteur -ArgumentList
pour passer des arguments, pas si commode.
Il y a aussi une autre approche.
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
Y compris la -NoNewWindow
option me donne une erreur: Start-Process : This command cannot be executed due to the error: Access is denied.
La seule façon que je pouvais le faire au travail était d'appeler:
Start-Process <path to exe> -Wait
Pour aller plus loin, vous pouvez même analyser à la volée
par exemple.
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}