Освоение PowerShell Pause: Техники работы с командной строкой и сценарии

Есть множество причин для приостановки выполнения скрипта. Возможно, скрипту нужно подождать ввода пользователя, замедлить скорость выполнения или дождаться завершения другого процесса, прежде чем продолжить. Как и в большинстве задач в 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.

Start-Sleep -Seconds 2 -Milliseconds 300

До 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:

[System.Threading.Thread]::Sleep(2300)

Чтобы использовать конструкцию timespan с методом Thread Sleep, вы можете сделать следующее:

[System.Threading.Thread]::Sleep([TimeSpan]::New(0, 0, 0, 2, 300))

Для бесконечной приостановки потока можно использовать [System.Threading.Timeout]::InfiniteTimeSpan, но имейте в виду, что это может заблокировать ваш процесс.

В отличие от Start-Sleep, метод Thread Sleep не позволяет вам выйти из режима сна, используя Ctrl-C. В зависимости от вашего приложения это может быть предпочтительным.

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

Хотя поток sleep имеет свои применения, лучше использовать один из других встроенных методов из-за этих проблем.

Read-Host

Вышеуказанные методы описывают способы приостановки выполнения, но только на определенное время. Другой способ приостановки выполнения – запрос пользовательского ввода. С этим методом необходимо выполнить ручное действие, но это может быть очень полезно, чтобы требовать подтверждения для продолжения и, возможно, включить дополнительный ввод.

Read-Host – один из наиболее распространенных способов запроса ввода пользователя. Запрашивая ввод пользователя, введенные данные можно сохранить для дальнейшего использования в коде или приостановить выполнение при необходимости.

Read-Host -Prompt "Press any key to continue"

После ввода текста необходимо нажать клавишу Enter или Return, чтобы продолжить выполнение. При этом, если не сохранять введенные данные в переменной, то текст будет выведен на консоль.

Press Enter to Move Execution Along

Если вы хотите сохранить введенный текст в переменную для последующего использования, просто присвойте ввод от Read-Host переменной.

$Input = Read-Host -Prompt "Press any key to continue"

Иногда вам может потребоваться считывать ввод как защищенную строку. К счастью, с Read-Host это делается очень просто.

$SecureInput = Read-Host -Prompt "Enter your password" -AsSecureString

Ctrl-C позволяет прервать выполнение запроса Read-Host.

Метод Console ReadKey

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

[Console]::ReadKey()
Console ReadKey Command

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

Do {
	$Key = [Console]::ReadKey($True)
	Write-Host $Key.Key
} While ( $Key.Key -NE [ConsoleKey]::Escape )
Do-While Loop Key

Пожалуйста, обратите внимание, что, поскольку мы ищем конкретную комбинацию клавиш, Ctrl-C не прервет ввод здесь.

Метод Host RawUI ReadKey

Наконец, у нас есть метод $host.UI.RawUI.ReadKey(). Этот метод аналогичен методу Console ReadKey, но он позволяет передавать дополнительные параметры в метод ReadKey для управления поведением и выводом.

$host.UI.RawUI.ReadKey()
RawUI.ReadKey

Есть несколько параметров ReadKeyOptions, которые могут быть переданы и сделать метод RawUI ReadKey более полезным.

  • AllowCtrlC
  • IncludeKeyDown
  • IncludeKeyUp
  • NoEcho

Это можно использовать следующим образом, чтобы включить события нажатия клавиши вниз и не выводить текст.

$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')

Этот метод позволит использовать Ctrl-C для выхода из команды, за исключением случаев, когда используется параметр AllowCtrlC.

Методы, не являющиеся встроенными

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

Windows

Pause

Команда паузы очень проста и отобразит Нажмите любую клавишу для продолжения . . ., оставаясь в этом состоянии до тех пор, пока не будет нажата клавиша для возобновления выполнения.

cmd /c 'pause'
Pause Command

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

Cmd/C Pause Command

Тайм-аут

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

# Пауза на 2 секунды
timeout /t 2

# Пауза на 5 секунд, но запретить прерывания клавишами
timeout /t 5 /nobreak

# Пауза бесконечно, пока не будет нажата клавиша
timeout /t -1
Timeout Command

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

Timeout Command Execution

Linux

Сон

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

sleep 2.3s
Sleep Command

Команда sleep также может дополнительно иметь суффиксы, которые позволяют определить более длительные периоды времени. Примеры:

  • sleep 1m – Спать одну минуту
  • sleep 2h – Спать два часа
  • sleep 1d – Спать один день

Читать -P

Наконец, еще один способ приостановки выполнения в Linux – использовать приложение read, чтобы приостановиться до нажатия клавиши Enter для продолжения выполнения. Существует дополнительный параметр времени ожидания, который продолжит выполнение, если клавиша Enter не будет нажата в указанное время.

read -p 'Press enter to continue' -t 5
Read Application to Pause

Заключение

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

Source:
https://adamtheautomator.com/powershell-pause/