如何用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
cmd /c pause | out-null
(这不是PowerShell的方式,但它更优雅。)
保存树木。 使用单线。
为了清楚起见,我认为在这里重新总结/总结select是值得的…然后提供一个新的变化,我相信提供了最好的效用。
<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中不起作用。
- 缺点:第一次使用时显然启动新的shell/窗口; 后续使用不明显,但仍有开销
<4>读主机
Read-Host -Prompt "Press Enter to continue"
- 优势:适用于PS-ISE。
- 缺点:只接受回车键。
<5> ReadKey复合
这是上面的<1>与从Adam's Tech Blog上的提议中提取的ISE解决方法/ kludge的组合(上面的评论在此提供的Nick提供的)。 我对后者做了两点小小的改进:如果你使用Set-StrictMode (你这样做,不是吗?),添加Test-Path来避免错误,最后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中工作(尽pipe只有input或鼠标点击)
- 缺点:不是一蹴而就的!
我假设你想从控制台读取input。 如果是这样,请使用Read-Host
。
像cmd /c pause
这样的解决scheme会导致新的命令解释器在后台启动并运行。 尽pipe在某些情况下可以接受,但这并不是很理想。
使用Read-Host
的解决scheme强制用户按Enter键 ,而不是真正的“任何键”。
这个解决scheme将给你一个真正的“按任意键继续”界面,并不会启动一个新的解释器,这将基本上模仿原来的pause
命令。
Write-Host "Press any key to continue..." [void][System.Console]::ReadKey($true)
除了迈克尔·索伦斯的回答:
在一个新的过程中ReadKey
Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -wait
- 优点:接受任何键,但正确排除Shift,Alt,Ctrl修饰键。
- 优势:适用于PS-ISE。