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

时间:2010-10-18 20:27:37

标签: 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

7 个答案:

答案 0 :(得分:194)

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

&LT 1为卤素; ReadKey(System.Console)

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

&LT 2 - ; ReadKey(RawUI)

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

&LT 3的密度; CMD

cmd /c Pause | Out-Null
  • 缺点:在PS-ISE中不起作用。
  • 缺点:首次使用时可见启动新的外壳/窗口;在后续使用中不明显但仍有开销

&LT 4是氢;读主机

Read-Host -Prompt "Press Enter to continue"
  • 优势:适用于PS-ISE。
  • 缺点:仅接受输入密钥。

&LT; 5个ReadKey复合

这是&lt; 1&gt;的复合物。以上是从Adam's Tech Blog的提案中提取的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
    }
}
  • 优点:接受任何键但正确排除Shift,Alt,Ctrl修饰键。
  • 优势:适用于PS-ISE(虽然只能使用Enter或鼠标点击)
  • 缺点:不是单行!

答案 1 :(得分:76)

cmd /c pause | out-null

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

保存树木。使用单行。

答案 2 :(得分:39)

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

答案 3 :(得分:19)

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

使用Read-Host的解决方案强制用户按 Enter 并且不是真正的&#34;任何键&#34;。

此解决方案将为您提供真实的&#34;按任意键继续&#34;接口并且不会启动新的解释器,它将基本上模仿原始的pause命令。

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

答案 4 :(得分:1)

在使用 v2 之前,您可能希望使用 FlushInputBuffer 丢弃任何错误输入控制台的字符,尤其是对于长时间运行的操作:

ReadKey

答案 5 :(得分:0)

除了Michael Sorens'回答:

&LT; 6个新进程中的ReadKey

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

答案 6 :(得分:0)

10 年后我来到这里......不知道从什么时候开始,但是“暂停”在 PowerShell 中的工作方式就像在 DOS 命令行中一样。