Как сделать паузу с PowerShell 2.0?

Хорошо, я теряю его. PowerShell раздражает меня. Я бы хотел, чтобы появился диалог паузы, и он не будет.

PS W:\>>> $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Exception calling "ReadKey" with "1" argument(s): "The method or operation is not implemented."
At line:1 char:23
+ $host.UI.RawUI.ReadKey <<<< ("NoEcho")
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Ответ 1

cmd /c pause | out-null

(Это не способ PowerShell, но он намного шире.)

Сохраните деревья. Используйте однострочные.

Ответ 2

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

< 1 > ReadKey (System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
  • Преимущество: принимает любую клавишу, но правильно исключает клавиши модификатора Shift, Alt, Ctrl.
  • Недостаток: не работает в PS-ISE.

< 2 > ReadKey (RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  • Недостаток: не работает в PS-ISE.
  • Недостаток: не исключает ключи-модификаторы.

<3 > cmd

cmd /c Pause | Out-Null
  • Недостаток: не работает в PS-ISE.
  • Недостаток: Видимо запускает новую оболочку/окно при первом использовании; не заметно при последующем использовании, но все еще имеет накладные расходы

< 4 > Read-Host

Read-Host -Prompt "Press Enter to continue"
  • Преимущество: Работает в PS-ISE.
  • Недостаток: принимает только клавишу Enter.

< 5 > ReadKey composite

Это композиция выше 1 с использованием обходного пути ISE/kludge, извлеченного из предложения Adam Tech Blog (любезно предоставлено Ником из предыдущих комментариев по этому вопросу страница). Я сделал два небольших улучшения для последнего: добавлен тестовый путь, чтобы избежать ошибки, если вы используете Set-StrictMode (не так ли?), И final Write-Host, чтобы добавить новую строку после нажатия клавиши, чтобы поместить подсказку в нужное место.

Function Pause ($Message = "Press any key to continue . . . ") {
    if ((Test-Path variable:psISE) -and $psISE) {
        $Shell = New-Object -ComObject "WScript.Shell"
        $Button = $Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
    }
    else {     
        Write-Host -NoNewline $Message
        [void][System.Console]::ReadKey($true)
        Write-Host
    }
}
  • Преимущество: принимает любую клавишу, но правильно исключает клавиши модификатора Shift, Alt, Ctrl.
  • Преимущество: работает в PS-ISE (хотя только с помощью Enter или мыши)
  • Недостаток: не один лайнер!

Ответ 3

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

Ответ 4

Решения, подобные cmd /c pause, приводят к запуску и запуску нового командного интерпретатора в фоновом режиме. Хотя это приемлемо в некоторых случаях, это не совсем идеально.

Решения, использующие Read-Host, заставляют пользователя нажимать Enter и на самом деле не являются "никакой клавишей".

Это решение предоставит вам настоящий интерфейс "нажмите любую клавишу для продолжения" и не запустит новый интерпретатор, который по существу имитирует исходную команду pause.

Write-Host "Press any key to continue..."
[void][System.Console]::ReadKey($true)

Ответ 5

В дополнение к Майкл Соренс ответьте:

< 6 > ReadKey в новом процессе

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -wait
  • Преимущество: Принимает любой ключ, но правильно исключает Shift, Alt, Ctrl ключи-модификаторы.
  • Преимущество: Работает в PS-ISE.