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"
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
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 .
il suffit d'utiliser d'Attente "processus" :
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
le travail est fait
si vous utilisez Start-Process <path to exe> -NoNewWindow -Wait
vous pouvez également utiliser l'option -PassThru
pour faire écho à la sortie.
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>)
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
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 $_ }
}