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 콘솔에서는 잘 작동합니다.
Charles Anderson

3
나는 단지 powershell을 엉망으로 만들고 있으며 2 년 반이 지난 후에도 여전히 지옥처럼 성가시다!
Bill K

당신이 읽는다면 아담의 기술 링크 또는 코드 @Michael Sorens 응답 (나는 2020 년이 쓰기로 약 반 페이지 아래로) 당신은 당신의 일시 정지를 포장하는 기술을 발견 할 수 있습니다 if (!$psise) { <# pause #> }. 당신이 나와 같고 일시 중지를 원하는 이유의 99 %가 화면이 깜박이기 전에 화면을 읽을 수 있도록하는 것이라면 도움이 될 것입니다. ISE에있는 경우 깜박이지 않고 멈출 필요가 없습니다
john v kumpf

답변:


88
cmd /c pause | out-null

(PowerShell 방식은 아니지만 훨씬 더 우아합니다.)

나무를 구하십시오. 한 줄을 사용하십시오.


7
/ c 문자열로 지정된 명령을 수행 한 다음 | out-null은 출력을 out-null로 파이프합니다. 여기서 절대 볼 수 없습니다. "계속하려면 아무 키나 누르십시오 ..."메시지를 보려면 파이프를 제거하십시오. 또한 이것은 PowerShell ISE에서 작동하지 않는 것 같습니다. 프로세스가 중단되고 아무 키도 누를 수 없습니다. 그 주위에 어떤 방법이 있습니까?
Wouter


7
@Nick 예, "cmd / c pause | out-null"을 대체하는 47 줄의 코드는 PowerShell 방식처럼 들립니다.
Bill K

@BillK 내가 링크 한 게시물은 Wouter의 질문에 대한 답변입니다. 동의하지 않습니까?
Nick

6
귀하의 답변에 대한 해설이 아니 었습니다. 귀하가 완전히 옳다고 생각합니다. PowerShell에 대한 해설입니다. 나는 약간 혐오감을 느낀다. 나는 Cobol에서 프로그래밍 한 이후로 이렇게 무의미한 모호한 장황함을 본 적이 없다.
Bill K

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

cmd /c Pause | Out-Null
  • 단점 : PS-ISE에서 작동하지 않습니다.
  • 단점 : 처음 사용할 때 새 셸 / 창을 눈에 띄게 시작합니다. 후속 사용시 눈에 띄지 않지만 여전히 오버 헤드가 있음

<4> 읽기 호스트

Read-Host -Prompt "Press Enter to continue"
  • 장점 : PS-ISE에서 작동합니다.
  • 단점 : Enter 키만 허용합니다.

<5> ReadKey 합성

이것은 위의 <1>과 Adam 's Tech Blog의 제안에서 추출한 ISE 해결 방법 / 클러 지의 합성물입니다 (이 페이지의 이전 의견에서 Nick 제공). 저는 후자에 대해 두 가지 약간의 개선을했습니다. Set-StrictMode 를 사용하는 경우 오류를 방지하기 위해 Test-Path를 추가했습니다 (그렇지 않습니까 ?!). 올바른 위치에 프롬프트합니다.

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
특히 어디에서나 작동하는 솔루션을 제공하기 때문에 최상의 답변
Petr

좋은 대답입니다! AllowCtrlC선택 2에 매개 변수를 추가 하면 사용자가 스크립트를 종료하지 않고 Ctrl + C를 클릭 할 수 있다는 점에 유의하고 싶습니다 . 그럼에도 불구하고이 선택은 여전히 ​​Ctrl 수정 자 키를 적절하게 제외하지 않습니다. : 참조 (사용자는 Ctrl 키를 클릭하면 단지로는 역할) 을 눌러 어떤 계속 키 : - Windows PowerShell을 팁은 Microsoft TechNet
오즈 에드

2
옵션 3과 5에는 또 다른 단점이 있습니다. Linux에서 작동하지 않음
bitbonk

43

콘솔에서 입력을 읽고 싶다고 가정합니다. 그렇다면 Read-Host.


3
Ditto-아마도 아래에서 훔친 프롬프트 텍스트를 추가 할 수 있습니다 .. Read-Host -Prompt "계속하려면 Enter를 누르십시오"
Jon 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

Michael Sorens의 답변 외에도 :

<6> 새로운 프로세스의 ReadKey

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
  • 장점 : 모든 키를 허용하지만 Shift, Alt, Ctrl 수정 자 키를 올바르게 제외합니다.
  • 장점 : PS-ISE에서 작동합니다.

이것은 훌륭하게 작동하지만, -NoNewWindow추가 되지 않는 한 powershell의 새 창이 나타납니다. :)
jeuxjeux20 dec.

@ jeuxjeux20, 제안에 감사드립니다, 나는 이것을 대답의 명령에 추가했습니다.
iRon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.