Comment dire à PowerShell d'attendre la fin de chaque commande avant de lancer la suivante?

j'ai un script PowerShell 1.0 Pour juste ouvrir un tas d'applications. La première est une machine virtuelle et les autres sont des applications de développement. Je veux que la machine virtuelle finisse de démarrer avant que le reste des applications ne soient ouvertes.

à bash je pourrais juste dire "cmd1 && cmd2"

voilà ce que j'ai...

C:ApplicationsVirtualBoxvboxmanage startvm superdooper
    &"C:ApplicationsNetBeans 6.5binnetbeans.exe"
158
demandé sur SteveC 2009-11-16 14:04:43

7 réponses

Normalement, pour les commandes internes PowerShell attend avant de lancer la commande suivante. Une exception à cette règle est external Windows subsystem based EXE. Le premier truc est de pipeline à Out-Null comme ainsi:

Notepad.exe | Out-Null

PowerShell attendra le bloc-notes.le processus exe a été abandonné avant de continuer. C'est chouette mais un peu subtile pour ramasser de la lecture du code. Vous pouvez également utiliser Start-Process avec le paramètre-Wait:

Start-Process <path to exe> -NoNewWindow -Wait

si vous utilisez la version PowerShell Community Extensions c'est:

$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()

une autre option dans PowerShell 2.0 est d'utiliser un travail de fond:

$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
274
répondu Keith Hill 2012-05-10 04:35:50

en plus d'utiliser Start-Process -Wait , Piper la sortie d'un exécutable fera attendre Powershell. Selon le besoin, je vais généralement pipe à Out-Null , Out-Default , Out-String ou Out-String -Stream . ici 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

les opérateurs de style CMD/Bash que vous avez cités me manquent.(&, &&, ||). Il il semble que nous devons être plus verbeux avec Powershell .

40
répondu Nathan Hartley 2017-05-23 12:02:56

il suffit d'utiliser d'Attente "processus" :

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

le travail est fait

9
répondu Flaviofire 2014-06-26 20:00:14

si vous utilisez Start-Process <path to exe> -NoNewWindow -Wait

vous pouvez également utiliser l'option -PassThru pour faire écho à la sortie.

5
répondu Sandy Chapman 2014-09-15 16:25:12

certains programmes ne peuvent pas traiter très bien le flux de sortie, en utilisant le tuyau de Out-Null peut ne pas le bloquer.

Et Start-Process a besoin du commutateur -ArgumentList pour passer des arguments, pas si commode.

Il y a aussi une autre approche.

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
5
répondu ifree 2015-12-23 07:57:48

incluant l'option -NoNewWindow me donne une erreur: Start-Process : This command cannot be executed due to the error: Access is denied.

la seule façon de la faire marcher était d'appeler:

Start-Process <path to exe> -Wait
2
répondu twasbrillig 2014-12-31 00:54:44

en allant plus loin, vous pourriez même Parser à la volée

p.ex.

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}
0
répondu Justin 2018-04-11 14:09:09