Як зробити "паузу" з PowerShell 2.0?


113

Гаразд, я програю. 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
У мене була така ж проблема в PowerShell ISE. Хоча добре працює в стандартній консолі PowerShell.
Чарльз Андерсон

3
Я просто псуюся з владою, і це все ще дратує як пекло, навіть через 2 1/2 роки!
Білл К

Якщо ви прочитаєте посилання Адама Теха або код у відповіді на @Michael Sorens (приблизно на півдорозі сторінки, як я це пишу в 2020 році), ви можете виявити техніку введення паузи if (!$psise) { <# pause #> }. Якщо ти схожий на мене, і 99% причин, коли ти хочеш зробити паузу, - це те, що ти можеш прочитати екран, перш ніж він блимає, то це допоможе, бо якщо ти в ISE, воно не моргає, і ти не «т потрібна пауза
джон v Kumpf

Відповіді:


88
cmd /c pause | out-null

(Це не спосіб PowerShell, але він набагато елегантніший.)

Збережіть дерева. Скористайтеся одноколісними.


7
/ c Виконує команду, задану рядком, а потім завершує | out-null передає висновок out-null, де ви його ніколи не побачите. Якщо ви хочете побачити повідомлення "Натисніть будь-яку клавішу для продовження ...", вийміть трубку. Також, схоже, це не працює в PowerShell ISE. Процес просто затримується, і ви не можете натиснути жодну клавішу. Як-небудь навколо цього?
Wouter

1
@Wouter Дивіться цей запис у блозі: Як правильно призупинити сценарій PowerShell
Нік

7
@Nick так, 47 рядків коду замінити "cmd / c пауза | out-null", що звучить як PowerShell.
Білл К

@BillK Повідомлення, до якого я посилався, відповідав на запитання Вутера. Ви не згодні?
Нік

6
Це не був коментар до вашої відповіді, я думаю, ви абсолютно праві. Це коментар до PowerShell. Я помірковано огидний - я не бачив такого безглуздого прикриваючого багатослів’я, оскільки програмував у Коболі.
Білл К

234

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

<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 /c Pause | Out-Null
  • Недолік: не працює в PS-ISE.
  • Недолік: при першому використанні помітно запускається нова оболонка / вікно; не помітний при подальшому використанні, але все ж має накладні витрати

<4> Читання-хост

Read-Host -Prompt "Press Enter to continue"
  • Перевага: працює в PS-ISE.
  • Недолік: приймає лише клавішу Enter.

<5> Композит ReadKey

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

9
Найкраща відповідь, тим більше, що вона пропонує рішення, яке працює скрізь
Петро

Чудова відповідь! Я хотів би зазначити, що додавання AllowCtrlCпараметра до вибору 2 дозволяє користувачеві натиснути Ctrl + C, не припиняючи сценарій. Тим не менш, цей вибір все ще належним чином не виключає ключ модифікатора Ctrl. (він діє так, як якщо користувач натискає лише клавішу Ctrl) Довідка: Microsoft TechNet - Порада для Windows PowerShell: Натисніть будь-яку клавішу для продовження
Oz Edri

2
Варіанти 3 та 5 мають ще один недолік: не працює на Linux
bitbonk

43

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


3
Ditto - Можливо, додайте текст підказки, викрадений знизу .. Read-Host -Prompt "Натисніть Enter, щоб продовжити"
J H H

21

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

Використовувані рішення Read-Hostзмушують користувача натискати Enterі насправді не є "жодною клавішею".

Це рішення дасть вам справжній інтерфейс "натиснути будь-яку клавішу для продовження" і не запустить нового інтерпретатора, який по суті буде імітувати оригінальну pauseкоманду.

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

Технічно ISE не входить у сферу застосування, оскільки в оригінальному запитанні було задано лише питання про Powershell 2.0 та виключено ISE. Якщо ви використовуєте ISE, просто використовуйте точку розриву.
Ro Yo Mi

4
1. Я не згоден, що ISE вийшов за рамки, але це зараз не має значення. 2. Я зауважив, що в ISE не працює, щоб допомогти перехожим у цьому питанні.
Bill_Stewart

2

Окрім відповіді Майкла Соренса :

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

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • Перевага: приймає будь-яку клавішу, але належним чином виключає клавіші модифікаторів Shift, Alt, Ctrl.
  • Перевага: працює в PS-ISE.

Це чудово працює, але з'являється нове вікно powerhell, якщо -NoNewWindowне додано :)
jeuxjeux20

@ jeuxjeux20, дякую за пропозицію, я додав це до команди у відповідь.
iRon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.