Как сделать "паузу" с 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
633   5  

5 ответов:

cmd /c pause | out-null

(Это не в PowerShell, но это гораздо более элегантно.)

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

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

ReadKey (System.Консоль)

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

ReadKey (RawUI)

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

Read-Host -Prompt "Press Enter to continue"
cmd

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

Read-Host

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

ReadKey composite

это составная часть выше с обходным путем ISE / kludge, извлеченным из предложения на технический блог Адама (любезно предоставлено ником из предыдущих комментариев на этой странице). Я сделал два небольших улучшения к последнему: добавлен тест-путь, чтобы избежать ошибки, если вы используете 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 или щелчком мыши)
  • недостаток: не один-лайнер!

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

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

решения с использованием Read-Host заставить пользователя нажать введите и на самом деле не "любой ключ".

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

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

кроме Michael Sorens' ответ:

ReadKey в новом процессе

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

Comments

    Ничего не найдено.