Как сказать PowerShell ждать завершения каждой команды перед запуском следующей?
у меня есть сценарий PowerShell 1.0, чтобы просто открыть кучу приложений. Первый-это виртуальная машина, а остальные-приложения для разработки. Я хочу, чтобы виртуальная машина завершила загрузку до открытия остальных приложений.
в Баш я мог бы просто сказать "cmd1 && cmd2"
вот что у меня есть...
C:ApplicationsVirtualBoxvboxmanage startvm superdooper
&"C:ApplicationsNetBeans 6.5binnetbeans.exe"
7 ответов:
обычно для внутренних команд PowerShell ожидает перед запуском следующей команды. Одним из исключений из этого правила является внешняя Подсистема Windows на основе EXE. Первый трюк-это конвейер до
Out-Nullвот так:Notepad.exe | Out-NullPowerShell будет ждать, пока Блокнот.процесс exe был завершен, прежде чем продолжить. Это изящно, но немного тонко, чтобы забрать из чтения кода. Вы также можете использовать Start-Process с параметром-Wait:
Start-Process <path to exe> -NoNewWindow -Waitесли вы не используя версию расширений сообщества PowerShell это:
$proc = Start-Process <path to exe> -NoWindow $proc.WaitForExit()другой вариант в PowerShell 2.0 - использовать фоновое задание:
$job = Start-Job { invoke command here } Wait-Job $job Receive-Job $job
кроме того, используя
Start-Process -Wait, конвейер вывода исполняемого файла заставит Powershell ждать. В зависимости от необходимости, я обычно буду трубить вOut-Null,Out-Default,Out-StringилиOut-String -Stream. здесь длинный список других вариантов вывода.# 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Я скучаю по операторам стиля CMD/Bash, на которые вы ссылались (&, &&, ||). Оно кажется, мы должны быть более подробно с Powershell.
просто используйте "Wait-process":
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dirзадания
Если вы используете
Start-Process <path to exe> -NoNewWindow -Waitвы также можете использовать Эхо-вывода.
некоторые программы не могут обрабатывать выходной поток очень хорошо, используя pipe to
Out-Nullне может блокировать его.
ИStart-Processнужны-ArgumentListпереключатель для передачи аргументов, не так удобно.
Есть и другой подход.$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
числе параметр
-NoNewWindowвыдает ошибку:Start-Process : This command cannot be executed due to the error: Access is denied.единственный способ заставить его работать - это позвонить:
Start-Process <path to exe> -Wait
принимая его дальше вы можете даже разобрать на лету
например
& "my.exe" | %{ if ($_ -match 'OK') { Write-Host $_ -f Green } else if ($_ -match 'FAIL|ERROR') { Write-Host $_ -f Red } else { Write-Host $_ } }
Comments