Как сказать PowerShell ждать завершения каждой команды перед запуском следующей?



у меня есть сценарий PowerShell 1.0, чтобы просто открыть кучу приложений. Первый-это виртуальная машина, а остальные-приложения для разработки. Я хочу, чтобы виртуальная машина завершила загрузку до открытия остальных приложений.



в Баш я мог бы просто сказать "cmd1 && cmd2"



вот что у меня есть...



C:ApplicationsVirtualBoxvboxmanage startvm superdooper
&"C:ApplicationsNetBeans 6.5binnetbeans.exe"
843   7  

7 ответов:

обычно для внутренних команд PowerShell ожидает перед запуском следующей команды. Одним из исключений из этого правила является внешняя Подсистема Windows на основе EXE. Первый трюк-это конвейер до Out-Null вот так:

Notepad.exe | Out-Null

PowerShell будет ждать, пока Блокнот.процесс 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

    Ничего не найдено.