Comment dire PowerShell attendre pour chaque commande à la fin avant de commencer la prochaine?

StackOverflow https://stackoverflow.com/questions/1741490

  •  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"
Était-ce utile?

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 $_ }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top