Заметки о Windows и других программных продуктах Microsoft...

Ставим PowerShell скрипт на паузу

Ставим PowerShell скрипт на паузу

Простой прием, позволяющий приостановить выполнение PowerShell скрипта до нажатия пользователем любой клавиши или отменить его совсем.

Для примера создадим скрипт ask.ps1, содержащий вот такой текст:

Write-Host ″Press any key to continue … or Ctrl+C to abort″

$x = $host.UI.RawUI.ReadKey(″NoEcho,IncludeKeyDown″)

$a = ″Скрипт″
$b = ″успешно″
$c = ″выполнен !!!″
Write-Host
Write-Host $a $b $c
Write-Host

Ключевым моментом здесь является конструкция:

$x = $host.UI.RawUI.ReadKey(″NoEcho,IncludeKeyDown″)

В ней мы используем метод ReadKey свойства RawUI, являющееся свойством UI, которое в свою очередь является свойством переменной среды $host, хранящей текущий сеанс PowerShell. Для ReadKey мы указываем следующие параметры:

IncludeKeyDown — этот параметр обеспечивает продолжение работы скрипта в том случае, если будет нажата какая-либо клавиша. Как вариант, можно использовать параметр IncludeKeyUp, в этом случае работа скрипта продолжится только после того, как клавиша будет отпущена.
NoEcho — предотвращает вывод на экран лишней информации.

Обратите внимание, что результат выполнения ReadKey мы помещаем в переменную $x, что также помогает предотвратить появление на экране ненужной информации.

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

пауза при выполнении скрипта

 

Важно. Данный трюк не работает в PowerShell ISE.

В приведенном примере у пользователя есть возможность отменить выполнение скрипта. Если вы не хотите предоставлять пользователю эту возможность, то надо добавить параметр AllowCtrlC:

$x = $host.UI.RawUI.ReadKey(″NoEcho,IncludeKeyDown,AllowCtrlC″)

В этом случае даже при нажатии клавиш Ctrl+C скрипт будет выполнен.

 
 
Комментарии
Виталий

смысл понятен, красиво но в большинстве случаев опасно.

по старинке Read-Host для просто «press enter» или если что важное то так

$reply = Read-Host -Prompt «Continue?[y/n]»
if ( $reply -match «[yY]» ) {
}

Ответить