Как вы делаете «паузу» с PowerShell 2.0? - PullRequest
98 голосов
/ 19 октября 2010

ОК, я теряю это.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

Ответы [ 5 ]

199 голосов
/ 13 марта 2014

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

<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.
  • Недостаток: принимает только клавишу ввода.

<5> Компоновка ReadKey

Это составная часть из <1> выше с обходным приемом ISE / kludge, извлеченным из предложения на Технический блог Адама (любезно предоставлено Ником из предыдущих комментариев на этой странице).Я сделал два небольших улучшения в последнем: добавлен Test-Path, чтобы избежать ошибки, если вы используете Set-StrictMode (да, не так ли ?!) и последний 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 или щелчком мыши)
  • Недостаток: не однострочник!
77 голосов
/ 24 августа 2011
cmd /c pause | out-null

(Это не способ PowerShell, но он намного элегантнее.)

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

40 голосов
/ 19 октября 2010

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

21 голосов
/ 12 марта 2014

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

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

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

Write-Host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
0 голосов
/ 06 августа 2017

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

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

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