你如何使用PowerShell 2.0进行"暂停"?

Der*_*ell 105 powershell

好的,我正在失去它.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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ens 214

我认为值得回顾/总结一下这里的选择是为了清晰......然后提供一个新的变体,我相信它提供了最好的效用.

<1> ReadKey(System.Console)

write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
Run Code Online (Sandbox Code Playgroud)
  • 优点:接受任何键但正确排除Shift,Alt,Ctrl修饰键.
  • 缺点:在PS-ISE中不起作用.

<2> ReadKey(RawUI)

Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Run Code Online (Sandbox Code Playgroud)
  • 缺点:在PS-ISE中不起作用.
  • 缺点:不排除修饰键.

<3> cmd

cmd /c Pause | Out-Null
Run Code Online (Sandbox Code Playgroud)
  • 缺点:在PS-ISE中不起作用.
  • 缺点:首次使用时可视化启动新的外壳/窗口; 在后续使用中不明显但仍有开销

<4> Read-Host

Read-Host -Prompt "Press Enter to continue"
Run Code Online (Sandbox Code Playgroud)
  • 优势:适用于PS-ISE.
  • 缺点:仅接受输入密钥.

<5> ReadKey复合

这是上面的<1>以及从Adam的技术博客上的提案中提取的ISE变通方法/ kludge 的综合(由Nick在本页的早期评论中提供).我对后者进行了两处略微的改进:添加了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
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 优点:接受任何键但正确排除Shift,Alt,Ctrl修饰键.
  • 优点:适用于PS-ISE(尽管只能使用Enter或鼠标点击)
  • 缺点:不是一个单行!

  • 最佳答案,特别是因为它提供的解决方案无处不在 (9认同)
  • 选项3和5有另一个缺点:不适用于Linux (2认同)

Car*_*nez 84

cmd /c pause | out-null
Run Code Online (Sandbox Code Playgroud)

(这不是PowerShell的方式,但它更优雅.)

拯救树木.使用单行.

  • / c执行string指定的命令,然后终止| out-null将输出管道输出为out-null,在这里你永远不会看到它如果你想看到"按任意键继续..."消息,请删除管道.此外,这似乎在PowerShell ISE中不起作用.这个过程很简单,你不能按任何键.有什么方法吗? (7认同)
  • 这不是对你答案的评论,我认为你完全正确.这是对PowerShell的评论.我有点反感 - 自从我在Cobol编程以来,我没有看到这么多无意义的模糊冗长. (5认同)
  • @Nick是的,47行代码替换"cmd/c pause | out-null",听起来像PowerShell方式. (4认同)

rer*_*run 41

我假设你想从控制台读取输入.如果是这样,请使用Read-Host.

  • 同上 - 也许添加从下面偷来的提示文本.. Read-Host -Prompt"按Enter继续" (3认同)

Ro *_* Mi 21

这些解决方案cmd /c pause会导致新的命令解释程序在后台启动和运行.虽然在某些情况下可以接受,但这并不是很理想.

使用Read-Host强制用户按下的解决方案Enter并不是真正的"任何关键".

此解决方案将为您提供真正的"按任意键继续"界面,并且不会启动新的解释器,这将基本上模仿原始pause命令.

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

  • 我不同意ISE超出范围,但现在这无关紧要.我注意到它在ISE中无法帮助路人解决这个问题. (3认同)

iRo*_*Ron 5

除了迈克尔·索伦斯的回答之外:

<6>在新进程中ReadKey

Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -Wait -NoNewWindow
Run Code Online (Sandbox Code Playgroud)
  • 优点:接受任何键,但正确排除 Shift、Alt、Ctrl 修饰键。
  • 优点:适用于 PS-ISE。