欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

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

已发表 2008年3月9日 17:33 作者 ghjconan

评论

# re: Windows PowerShell每周提示(28):暂停脚本直到用户按下某一个键

2008年3月22日 13:57 by dikex

$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyup")

powershellgui执行这个居然会出错:

ERROR: 使用“1”个参数调用“ReadKey”时发生异常:“The method or operation is not implemented.”

# re: Windows PowerShell每周提示(28):暂停脚本直到用户按下某一个键

2008年4月10日 12:23 by ghjconan

请尽可能在PowerShell测试相关代码

因为PowerGUI只针对部分cmdlet做了相关处理

禁止匿名发表评论