Windows PowerShell每周提示(28):暂停脚本直到用户按下某一个键
对于面向图形的脚本语言而言,一个优势是很容易暂停一个脚本直到用户准备好继续执行。
例如,假设你有一个VBScript脚本需要等待用户完成某事后(比如说在打印机内放置特殊纸张)才能继续执行。那么如何暂停脚本直到用户准备好继续呢?一个简单的方法是显示一个消息框:
一旦你做了这件事,脚本会进入一种挂起状态,并且不会继续执行直到用户单击OK按钮。如果用户永远不单击OK按钮,那么脚本将永远不会继续执行。但是这没关系,毕竟大致的思路是直到用户允许脚本执行时脚本才会执行。
然而,在面向命令行的语言中这却成了一个问题。姑且承认在PowerShell中有方法来显示消息框;然而这么做的话将会降低用户希望从PowerShell命令行中得到的体验。一个更好更自然的,被命令行广泛使用的信息是:
| Press any key to continue ... |
此时,你的脚本将会暂停直到用户按下键盘上任意键。如果用户不按键盘上的任意键,那么脚本将永远不会执行下去。这是我们想要脚本所做的。
不错的想法?也许,另一方面,关于Windows PowerShell真正不错的事是:如果你有什么事想要做,那么PowerShell会提供一个非常好的机会来完成这件事。你想要暂停脚本直到用户按下键盘上的任意键?你所要做的只是输入以下内容:
| Write-Host "Press any key to continue ..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") Write-Host Write-Host "A" Write-Host "B" Write-Host "C" |
那我们在这里做了些什么?在第一行我们只是显示那个广泛使用的的提示“Press any key to continue …”;这部分应当是相当通俗易懂的。而更有趣的是发生在第二行的事:
| $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") |
在这一行我们使用PowerShell的自动变量$host(这事实上是.NET Framework System.Management.Automation.Host类的一个实例)和Readkey方法。(这事实上是RawUI属性的一个方法,而RawUI又是UI属性的一个属性,而UI则又是$host的一个属性。就如同踝骨和和小腿骨相连,而小腿骨和膝骨相连,……)ReadKey方式使我们能得到有关刚按下的键的相关信息。当然在本例中我们所需关心的只是一个键被按下了而已。所以我们传递给ReadKey两个参数:
NoEcho.本参数用来防止当用户按下某一键时屏幕上出现任何信息。如果你将本参数留空,那么有关所按下的键的信息将会回显到屏幕上。
IncludeKeyDown.本参数告诉脚本当某一键被按下时脚本立即继续执行,这意味着即使用户按住某一键脚本也将继续执行。如果你更喜欢等到用户释放某一键时脚本继续执行,那么使用这个参数作为替代:IncludeKeyUp.
我们还可以向ReadKey方法添加另外一个参数:AllowCtrlC。在Windows PowerShell中,按下Ctrl+C通常会导致脚本被终止执行。然而如果你向ReadKey方法添加AllowCtrlC参数,那么用户可以选择按下Ctrl+C取代其它任意键。如果他们这么做,脚本将不会终止执行,而是当用户按下键盘上某一键时继续执行。(但是这种情况只和ReadKey方法相关,如果用户在其它情况下按下Ctrl+C那么脚本将终止执行。)
| 注意.那么你为什么想要这么做?问得好,如果没有其它理由的话,这样做是用来防止用户通过按下Ctrl+C来终止你的脚本。 |
同时也要注意,我们将ReadKey方法的结果赋值到变量$x。这也帮助避免当用户按下某一键时,屏幕上出现任何信息。从命令中移除$x =你就会知道我们再说什么,你将看到类似以下的内容:
| VirtualKeyCode Character ControlKeyState KeyDown -------------- --------- --------------- ------- 88 x 0 True |
可曾听说过短语“太多的信息”?这就是太多的信息。
脚本的剩余部分只是将一些信息显示在屏幕上,来证明脚本确实是暂停过后才继续的。当你运行这个脚本时,首先在你的屏幕上应当出现以下内容:
| PS C:\Scripts> c:\scripts\test.ps1 Press any key to continue ... |
随后,当你按下键盘上的任意键时,屏幕上的内容应当看起来像这样:
| PS C:\Scripts> c:\scripts\test.ps1 Press any key to continue ... A B C |
的确很酷,不是么?下周我们将向你展示另一个很棒的小技巧用来控制用户输入。下周见!
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/jan08/pstip0118.mspx