Поиск по сайту:

Как ждать команды в PowerShell


Когда вы запускаете команду или начинаете процесс из PowerShell, вы часто хотите дождаться завершения команды или процесса, прежде чем скрипт продолжит выполнение. Самый простой вариант для этого - использовать параметр -Wait из cmdlet Start-Process, но есть и другие варианты.

В этой статье мы рассмотрим, как использовать параметр -Wait, использовать cmdlet Wait-Process, и я также покажу вам некоторые другие варианты.

Подождите в PowerShell

Мы можем использовать PowerShell для всевозможных задач, включая запуск программы или выполнение другой команды. Но “проблема” с PowerShell заключается в том, что по умолчанию он не будет ждать завершения программы или команды.

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

  • -Ожидание параметр для cmdlet Start-Process
  • Wait-Process
  • Start-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.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.