Как ждать команды в PowerShell
Когда вы запускаете команду или начинаете процесс из PowerShell, вы часто хотите дождаться завершения команды или процесса, прежде чем скрипт продолжит выполнение. Самый простой вариант для этого - использовать параметр -Wait из cmdlet Start-Process, но есть и другие варианты.
В этой статье мы рассмотрим, как использовать параметр -Wait, использовать cmdlet Wait-Process, и я также покажу вам некоторые другие варианты.
Подождите в PowerShell
Мы можем использовать PowerShell для всевозможных задач, включая запуск программы или выполнение другой команды. Но “проблема” с PowerShell заключается в том, что по умолчанию он не будет ждать завершения программы или команды.
Программа просто попытается запустить программу или выполнить команду, и если это будет успешно, она продолжит к следующей части вашего скрипта. Теперь в некоторых ситуациях вы хотите, чтобы PowerShell подождал, прежде чем продолжить. Для этого у нас есть несколько вариантов:
-Ожиданиепараметр для cmdletStart-ProcessWait-ProcessStart-Sleep
cmdlet Start-Process с опцией -Wait
Когда вы хотите запустить программу или команду из PowerShell, вы можете использовать командлет Start-Process. Давайте рассмотрим пример: мы собираемся открыть текстовый файл в Блокноте и дождаться, пока пользователь закроет файл, прежде чем продолжить выполнение сценария:
Open File1.txt in the default editor (notepad)
Start-Process -FilePath "C:\temp\File1.txt" -Wait
Notepad is closed, get the content of the file
Get-Content -path "C:\temp\File1.txt"
Если вы запустите указанный код в PowerShell, вы увидите, что откроется Блокнот, позволяя вам написать содержимое в файл, а после его закрытия содержимое файла будет отображено в консоли.
Wait-Process командлет
Другим вариантом является использование cmdlet Wait-Process. Этот cmdlet ожидает, пока один или несколько процессов будут закрыты, прежде чем позволит PowerShell продолжить. Важно отметить, что cmdlet Wait-Process не работает на Linux или macOS.
Чтобы проверить, закрыт ли процесс, нам сначала нужно знать имя процесс или идентификатор процесса. Другой вариант - использовать объект процесса, который мы, например, можем получить с помощью командлетов Get-Process или Start-Process.
Если вы знаете имя процесса и оно уникально, вы можете просто использовать параметр -name, чтобы получить и дождаться завершения процесса:
Wait-Process Name "Notepad"Другим вариантом является сначала поиск процесса с помощью командлета Get-Process. Этот командлет выведет список всех запущенных процессов, но мы также можем отфильтровать процессы по имени, используя параметр -name. Хорошо знать, что мы можем использовать подстановочные знаки в имени:
$proc = Get-Process -Name "Notepad"
Wait-Proces -Id $proc.idМы также можем комбинировать Start-Process и Wait-Process. Для этого нам потребуется использовать параметр -PassThru для команды Start-Process, чтобы она вернула объект процесса.
Это позволяет нам выполнять задачи во время работы процесса, но проверить позже в скрипте, завершился ли процесс, прежде чем продолжить с последней частью:
Start the process
$process = Start-Process -FilePath "notepad.exe" -ArgumentList "C:\temp\File1.txt" -PassThru
Do something in between
Write-Output "Process $($process.Id) is running."
Wait untill process is finished
Wait-Process -Id $process.Id
Write-Output "Process has finished."Start-Sleep командлет
Последний метод, который вы можете использовать, чтобы дождаться завершения процесса в PowerShell, — это метод Start-Sleep. Этот командлет не может проверить, запущен процесс или нет, а просто позволяет PowerShell ждать определенное количество времени.
Это все еще может быть довольно полезно, если, например, вы знаете, что процесс всегда требует несколько секунд, чтобы запуститься и завершиться.
Команда Start-Sleep работает, указывая, как долго, в секундах или миллисекундах, PowerShell должен ждать.
Например, чтобы заставить PowerShell ждать 5 секунд, мы можем использовать:
Wait for 5 seconds before continuing
Start-Sleep -Seconds 5Ждите ввода
Другой метод, который я хочу вам показать, заключается в том, чтобы ждать ввода в PowerShell. Иногда проще позволить PowerShell подождать нажатия клавиши, прежде чем продолжить. Это может быть любое нажатие клавиши или конкретная клавиша, если вы хотите. У нас есть два варианта ожидания ввода: мы можем использовать метод ReadKey из класса System.Console .Net или мы можем использовать метод Read-Host.
Метод ReadKey ниже не будет выводить никаких данных в консоль (кроме write-host, конечно), но он не работает в PowerShell ISE (хотя я все равно рекомендую использовать Visual Studio Code...)
Write-Host "Press any key to continue..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-NullОднако с помощью Read-Host мы можем указать, какую клавишу пользователь должен нажать. Это дает немного больше контроля над тем, когда продолжить сценарий. В приведенном ниже примере мы комбинируем цикл While с командлетом Read-Host, чтобы он продолжал запрашивать нажатие клавиши Y, прежде чем PowerShell продолжит.
while ((Read-Host "Press 'Y' to continue") -ne 'Y') {}Завершение
Когда вы запускаете процесс или команду из PowerShell, лучше всего использовать cmdlet Start-Process в сочетании с параметром -Wait. Если процесс уже запущен, то лучшим вариантом будет использовать cmdlet Wait-Process.
Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.
