Есть множество причин для приостановки выполнения скрипта. Возможно, скрипту нужно подождать ввода пользователя, замедлить скорость выполнения или дождаться завершения другого процесса, прежде чем продолжить. Как и в большинстве задач в PowerShell, существует несколько способов приостановки скрипта. В зависимости от того, что вы пытаетесь достичь, выбранный вами метод приостановки будет иметь свои сильные и слабые стороны. Еще одна особенность доступных опций – новая возможность PowerShell для кросс-платформенности. Поскольку PowerShell часто используется как способ “склеивания” различных технологий вместе, подобно Windows, командная строка Linux имеет свои варианты приостановки выполнения, которые также могут быть интегрированы в PowerShell.
Методы приостановки PowerShell
Какие существуют различные способы приостановки выполнения скрипта? В этой статье мы собираемся разложить возможность приостановки на настольные и не настольные команды. Под настольными мы подразумеваем те команды, которые являются встроенными функциями или методами PowerShell или .NET. Ненативные методы определяются как программы, специфичные для Windows и Linux, которые могут использоваться совместно с PowerShell.
Настольные методы
Start-Sleep
[System.Threading.Thread]::Sleep()
Read-Host
[Console]::ReadKey()
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Ненативные методы
Windows
pause
timeout
Linux
sleep
read -p
Как вы можете видеть, есть несколько различных вариантов, каждый со своими плюсами и минусами. Какой вы выберете, будет влиять на то, как будет приостановлено выполнение, и какие другие эффекты может вызвать это простой.
Встроенные Методы
Для начала мы начнем с описания встроенных методов, так как они наиболее часто используются в скриптах.
Start-Sleep
Самая часто используемая команда приостановки – это безусловно, Start-Sleep
. Эта команда принимает два простых входных параметра: -Seconds
и -Milliseconds
. Секунды могут быть числом типа System.Double
, а миллисекунды принимают только значения типа System.Int32
. Комбинируя их, можно достичь точного контроля над длительностью паузы. Start-Sleep
также имеет псевдоним sleep
.
До PowerShell 6.2.0 вы не могли бы написать значение с дробными секундами, например, 2.3
, что является такой же длительностью времени, на которое мы приостанавливаемся в вышеприведенном коде. С версии 6.2.0 дробные значения теперь поддерживаются, поэтому вместо того, чтобы указывать секунды и миллисекунды независимо, вы теперь можете указать: -Seconds 2.3
.
Важно отметить, что вы можете выйти из функции
Start-Sleep
, нажавCtrl-C
. Это не верно для всех методов!
Thread Sleep
A less commonly used method of pausing execution is the [System.Threading.Thread]::Sleep()
.NET method. By passing in a System.Int32
or a TimeSpan
value, this allows pausing of the current thread for a set amount of time. For example, to pause by that same amount of time, 2.3
seconds, as in our Start-Sleep
example, we can write:
Чтобы использовать конструкцию timespan с методом Thread Sleep, вы можете сделать следующее:
Для бесконечной приостановки потока можно использовать [System.Threading.Timeout]::InfiniteTimeSpan
, но имейте в виду, что это может заблокировать ваш процесс.
В отличие от
Start-Sleep
, метод Thread Sleep не позволяет вам выйти из режима сна, используяCtrl-C
. В зависимости от вашего приложения это может быть предпочтительным.
Также важно знать о потоке sleep, что это не гарантия точного времени. Все потоки sleep гарантируют, что они будут ждать хотя бы столько секунд. Поскольку подсчет времени сна потока совпадает с тактовыми импульсами часов, другие программы могут прервать эту функцию паузы и заставить ожидание занять больше времени.
Хотя поток sleep имеет свои применения, лучше использовать один из других встроенных методов из-за этих проблем.
Read-Host
Вышеуказанные методы описывают способы приостановки выполнения, но только на определенное время. Другой способ приостановки выполнения – запрос пользовательского ввода. С этим методом необходимо выполнить ручное действие, но это может быть очень полезно, чтобы требовать подтверждения для продолжения и, возможно, включить дополнительный ввод.
Read-Host
– один из наиболее распространенных способов запроса ввода пользователя. Запрашивая ввод пользователя, введенные данные можно сохранить для дальнейшего использования в коде или приостановить выполнение при необходимости.
После ввода текста необходимо нажать клавишу Enter или Return, чтобы продолжить выполнение. При этом, если не сохранять введенные данные в переменной, то текст будет выведен на консоль.

Если вы хотите сохранить введенный текст в переменную для последующего использования, просто присвойте ввод от Read-Host
переменной.
Иногда вам может потребоваться считывать ввод как защищенную строку. К счастью, с Read-Host
это делается очень просто.
Ctrl-C
позволяет прервать выполнение запросаRead-Host
.
Метод Console ReadKey
Используя метод [Console]::ReadKey()
, можно легко считывать команды с клавиатуры вместе с модификаторами, приостанавливая выполнение программы. По умолчанию отправленные команды с клавиатуры отображаются на экране как объект System.ConsoleKeyInfo
. Это включает в себя значения Key
, KeyChar
и Modifiers
, которые могут быть очень полезны при проверке определенных комбинаций клавиш.

Часто может возникнуть необходимость проверить определенный ввод с клавиатуры перед продолжением выполнения программы. Это легко сделать с помощью цикла Do-While
, как показано ниже.

Пожалуйста, обратите внимание, что, поскольку мы ищем конкретную комбинацию клавиш,
Ctrl-C
не прервет ввод здесь.
Метод Host RawUI ReadKey
Наконец, у нас есть метод $host.UI.RawUI.ReadKey()
. Этот метод аналогичен методу Console ReadKey, но он позволяет передавать дополнительные параметры в метод ReadKey для управления поведением и выводом.

Есть несколько параметров ReadKeyOptions
, которые могут быть переданы и сделать метод RawUI ReadKey более полезным.
AllowCtrlC
IncludeKeyDown
IncludeKeyUp
NoEcho
Это можно использовать следующим образом, чтобы включить события нажатия клавиши вниз и не выводить текст.
Этот метод позволит использовать
Ctrl-C
для выхода из команды, за исключением случаев, когда используется параметрAllowCtrlC
.
Методы, не являющиеся встроенными
В этом разделе мы рассмотрим несколько методов приостановки выполнения сценария, предназначенных для использования вне зависимости от PowerShell конкретных утилит, которые можно интегрировать в сценарии PowerShell в зависимости от ваших потребностей.
Windows
Команда паузы очень проста и отобразит Нажмите любую клавишу для продолжения . . .
, оставаясь в этом состоянии до тех пор, пока не будет нажата клавиша для возобновления выполнения.

Вы можете спросить, как использовать это в сценарии, но, как и любую другую команду, вставьте команду cmd /c 'pause'
в свой сценарий, чтобы использовать встроенную функциональность.

Обычно используется в файлах пакетных команд Windows, команда тайм-аута позволяет приостанавливать выполнение на определенное количество секунд и при необходимости игнорировать любые клавишные команды. Обычно выполнение возобновляется после нажатия пользователем клавиши, даже если период тайм-аута не истек. Просто передайте количество секунд для использования команды.

Как и с командой pause
, вставьте команду timeout
в сценарий. В приведенном ниже примере мы нажимаем клавишу Enter для продолжения.

Linux
Как и команда pause
в Windows, команда sleep
в Linux позволяет устанавливать произвольное значение для сна. В отличие от команды паузы, команда sleep
имеет несколько дополнительных параметров, обеспечивающих гибкость во времени сна.

Команда sleep
также может дополнительно иметь суффиксы, которые позволяют определить более длительные периоды времени. Примеры:
sleep 1m
– Спать одну минутуsleep 2h
– Спать два часаsleep 1d
– Спать один день
Наконец, еще один способ приостановки выполнения в Linux – использовать приложение read
, чтобы приостановиться до нажатия клавиши Enter для продолжения выполнения. Существует дополнительный параметр времени ожидания, который продолжит выполнение, если клавиша Enter не будет нажата в указанное время.

Заключение
Как видите, существует множество способов приостановки выполнения в скрипте или в командной строке. В зависимости от ваших потребностей это может быть так же просто, как команда Start-Sleep
, или более сложный процесс, управляемый вводом. В сочетании с собственными командами, приостановка PowerShell позволяет гибкость практически в любой среде и максимальную полезность сценария.