Windows 2000及其以后版本为cmd命令增加了基本的Tab自动补全功能的支持,PowerShell是微软第1个实现为文件、函数、变量和命令提供了该支持的产品,并且还可以根据需要定制化。在第13章中讲解了如何使用Tab自动补全功能,并且介绍了如何使自定义函数提供Tab键自动补全名称支持。PowerTab也采用这种方式,并且增加了很多高级特性。
       PowerTab是由微软公司名为“Marc van Orsouw”的MVP创建的一个免费工具,它也被称为“/\/\o\/\/”或“PowerShell Guy”。这一工具由一系列脚本组成,将这些脚本嵌入到PowerShell机制中可以提供用户扩展的Tab实现。它通过搜索对象来提供更好的实现建议,包括默认的shell甚至未触及对象,如.NET类型的WMI类名,以及其他对象。该工具还通过提供包含各种建议的下拉框来改善用户体验,默认的Tab扩展允许通过按Tab键循环提供支持。而PowerTab将会列出所有建议,然后可以通过使用方向键、Tab键或Shift+Tab键来选择所需。
        本文是笔者的新书《Windows PowerShell2.0应用编程最佳实践》中第二十五章的内容,预计11月底出版,本文主要是讲述PowerTab的主要特性,会使读者能够更容易地使用命令提示符。

1、安装、禁用和卸载PowerTab
PowerTab未提供自动安装包,可以从作者的网站http://thepowershellguy.com/blogs/posh/archive/2009/05/15/powerTab-0-99b2-ctp3-fix.asp上下载ZIP包来安装。尽管目前PowerTab还是测试版,最新版本是0.99beta2。但这个工具相当稳定,到目前为止尚未出现过任何崩溃或错误的情况。为安装该版本,从测试页下载ZIP包,当前版本的PowerTab文件名是“PowerTab99b2-fixed.zip”。然后解压缩到选定的文件夹中,最好使用标准路径,如“C:\Program Files\PowerTab”,在安装后最好不要改动这个路径。这里为了方便,选择的路径是“C:\PowerShell\PowerTab”。
在文件夹中包含Setup.Cmd的批处理命令,执行即可开始安装。其作用为初始化PowerShell运行的环境变量,并通过dot-sourcing方式引用PowerTabSetup.ps1开始安装。
【注意】
如果不需要使用dot-source脚本,则需要重启当前Shell实例。
安装过程如图1-1所示,选择安装过程中出现的选项,然后等待安装完成。
          图1-1  通过批处理安装PowerTab
安装脚本会创建一个默认的配置文件,为只读XML格式且名为“PowerTabConfig.xml”,默认与描述脚本保存在同一个文件夹中。
安装脚本会更新描述文件脚本,同时会附加如下代码,当启动shell时这些代码会激活PowerTab
# Default PowerShell Profile
# Generated by PowerTab TabCompletionSetup
 
################ Start of PowerTab Initialisatie Code ##############
#
#  added to Profile by PowerTab Setup For Loading of Custom TabExpansion,
#
# /\/\o\/\/ 2007
#
# http://ThePowerShellGuy.com
#
 
# Initialize PowerTab
 
& 'C:\PowerShell\PowerTab\Init-TabExpansion.ps1' `
    -ConfigurationLocation 'D:\My Documents\WindowsPowerShell'
 
############## End of PowerTab Initialisatie Code ###############
最后安装脚本会创建Tab实现数据库,并且保存为TabExpansion.xml文件。创建数据库是一个冗长的过程,因为脚本要使用所有.NET类型和WMI类,最后得到包含类和命令名称的本地缓存用来完成Tab实现。
默认情况下PowerTab会在PowerShell的配置文件中写入初始化运行环境,这样才能在安装完成后跟随PowerShell启动。为了检查该配置文件中是否包含PowerTab,在PowerShell控制台执行如图1-2所示的命令。在包含目录路径的两行之前增加井号(#),即将其屏蔽,这样禁用了PowerTab。其中的“C:\PowerShell\PowerTab”是本机的PowerTab的安装路径,“D:\My Documents\WindowsPowerShell”是PowerShell的配置文件存放位置。
 
         图1-2  通过修改配置文件屏蔽PowerTab
如果要卸载PowerTab,可在PowerShell控制台下键入notepad $profile启动字处理软件。删除配置文件中关于PowerTab的内容(务必做好备份,然后清理上面提到的两行内容)和PowerTab的安装目录,在这里删除“C:\PowerShell\PowerTab”即可。
2Power Tab的工作原理
安装成功后PowerTab完全替代shellTab实现机制,提供了所有标准实现,如命令行、变量和函数等,同时增加了很多其他特性。例如,在输入.NETSystem.Net.WebClient类时按Tab键打出类的全名时,PowerTab以新对象嵌入的方式完成全名或部分,图25-3所示为建议列表。
                      1-3  建议列表
shell窗口左上角的Tab文本区表示PowerTabTab实现操作的核心,如果从列表中选择一种实现,该列表会立即消失。
使用其他对象时,无论这些对象来自.NETCOMWMIPowerTab均列举其属性和方法,并提供实现。以System.Net.WebClient为例,输入方法名,按Tab键完成DownLoad*方法。PowerTab就会从Internet上下载数据,如图1-4所示。
 
               图1-4  Internet上下载数据
方法和属性补全的工作原理不仅限于实例方法也同样应用于静态方法,PowerTab通过检测类型描述和:分隔符,从类型的静态成员中提供实现。
PowerTab通过为WMI类名提供实现使得WMI的使用更加简单,使用WMI的障碍之一是需要记住所用的大量类名。PowerTab正好解决了这一问题,图1-5所示为在工作过程中PowerTab如何指定正确的WMI类名。
               图1-5  PowerTab如何指定正确的WMI类名
PowerTab通过检测WMI类名的前缀来找到类,如果当前类以WMI_CIM_MSFT开头,则自动补全功能会跟进显示响应的对象集。
PowerShell对命令历史的支持存在缺陷,可以使用DOSKEY和按F7键得到可视化的命令清单。当有很多命令历史时,这个列表不便于查找,并且很难定位到需要的命令,PowerTab通过引入特别的语法来搜索历史缓冲区来匹配自动补全以解决这一问题。如果想得到所有包含“cd”字符串的命令,则需要键入h_cd后按Tab键。图1-6所示为PowerTab实现历史命令的自动补全。
           图1-6  PowerTab实现历史命令的自动补全
h_为前缀的命令的实现会删除h_部分,键入h­_后按Tab键也会列出存储在历史缓冲器中的所有命令。使用h_前缀相当于为对历史命令增加了一个命名空间,便于区别用户查询已执行的命令历史,还是执行新命令。
使用PowerShell时命令参数的名称很难记忆。例如,使用Get-Process cmdlet 调用过程实例时,应该使用-Name 参数,但却一直尝试用根本不存在的-Process 参数。使用PowerTab可解决这个问题。只要在一个cmdlet名后键入一个连字符,然后按Tab键会显示该cmdlet的所有参数的匹配列表。图1-7所示为Get-Process cmdlet的匹配列表。
  
         图1-7  Get-Process cmdlet的匹配列表
这个特性可以应用在函数和外部脚本文件中。
2.1  数据栅格弹出窗口
有时很小的Shell窗口显示过多的信息使得查看变得困难,PowerTab通过打开新窗口来解决这个问题。新窗口会阻止控制台窗口中显示的Tab自动补全信息,而将信息显示在一个新的数据网格中。用户在其中查看详细的信息,然后通过双击或按Enter键选择一行,被选中的项会作为有效的实现返回。
与原始的Tab自动补全语法很相似,PowerTab提供多种捷径来弹出新窗口。最吸引人的可能是返回一个WMI类的列表,因为有关WMI类的相关信息的数量过多,在控制台查看很不方便。为了弹出这个窗口,在WMI类名后键入W_,然后按Tab键。图25-8所示为PowerTab启动网格窗口显示的WMI类。
             图1-8  PowerTab启动网格窗口显示的WMI
【提示】
在弹出窗口中使用W_捷径匹配时,必须跳过WMI类名的Win32_部分。为了得到proc串的类,也可能是Win32_Process。必须键入w_proc[Tab],键入w_win32_proc[Tab]无效。
PowerTab还支持如下方法来弹出一个新窗口。
1t_:显示.NET类型的列表。
2f_ 列出当前定义的函数。
3d_:得到当前目录下的所有文件和子目录。
4g_:列出所有保存在历史命令中的命令。
5c_:显示自定义匹配。
PowerTab可使函数为用户弹出新窗口,以更加友好的方式来展示对象完全得益于名为“out-dataGridView”的函数。可为其输入一个对象集合,图1-9所示为使用该函数来展示进程ID、名称,以及为所有过程设置属性值,执行结果如图1-10所示。
   
1-9  out-dataGridView函数显示对象集合           1-10  执行结果
3  配置PowerTab
PowerTab的主要配置文件是PowerTabConfig.xml,与PowerShell描述脚本保存在相同的目录中。PowerShell配置文件在系统中的变量是$profile,可以通过键入$profile查找到配置文件的地址进而找到PowerTab配置文件,在Windows Vista系统中可能保存在C:\Users\<UserName>\Documents\WindowsPowerShell文件夹中。XML文件可读,而且很容易手动编辑文件。即以属性方式来定义设置,XML元素如下:
<Config>
<Category>Global</Category>
<Name>TabActivityIndicator</Name>
<Value>1</Value>
<Type>bool</Type>
</Config>
如果需要PowerTab移除在shell窗口的左上角显示Tab扩展的文字区,则必须将1改为0,并且在修改配置文件后重启Shell进程才能生效。
PowerTab允许用户修改其配置文件,全局变量$PowerTabConfig是指向所有配置的入口。例如,查看Tab行动指示器是否可用,则查看TabActivityIndicator属性。要将指示器禁用,则将此属性设置为$false,如图1-11所示。
 
                图1-11  将属性设置为$false
如果要保存配置,则调用Export-TabExpansionConfig函数,如1-12所示。
           图1-12  调用Export-TabExpansionConfig函数
3.1  智能感知补全程序
PowerTab中的Tab自动补全处理程序称为“ConsoleList”的处理程序,它可以绘制画出包含自动补全列表的方框,由名为“Lerch.PowerShell.dllPowerShell”管理单元(作者为Aaron Lerch http://www.aaronlerch.com)发布,该管理单元提供了智能补全处理处理程序。如此命名是因为它打开一个小的弹出窗口,如同在Visual Studio .NET和其他开发环境用来提供匹配的智能弹出提示。
为了使intelligence处理程序可用,需要注册LerchSnapIn管理单元。首先以管理员运行PowerShell,然后定位到PowerTab的安装目录并调用installutil.exe注册Lerch.PowerShell.dll,如图1-13所示。
              图1-13  调用installutil注册intelligence处理程序
确保安装成功完成,并且在installutil命令中没有出现任何错误提示。
【提示】
installutil.exe程序是.NET框架中的一部分,如果它在系统路径中不存在,可以在框架的安装文件中找到该文件。通常情况下安装在C:\Windows\Microsoft.NET\Framework\v2.0.50727\下,如果环境变量Path中没有添加该目录,则不能直接调用它。
如果安装顺利,则需确保当开启shell会话时加载snap-in。为此,需要在配置脚本中增加一个对Add-PSSnapIn的调用。用记事本打开配置脚本,其路径可以通过调用全局变量$profile找到,在PowerTab初始化代码前添加下面的代码:
#add the Lerch IntelliSense snap-in (needed by PowerTab)
Add-PSSnapin LerchSnapIn
# Initialize PowerTab
需要注意的是一定要在PowerTab启动代码前几句加载管理单元,否则不会加载智能提示。当然其中的注释并不是必须的,但是可提高长期积累且不断添加内容的配置文件的可以读性。
还需要修改PowerTab的配置,以设置DefaultHandler的属性。最后试着按Tab键匹配,结果如图1-14所示。这里修改默认处理为智能提示的操作过程只是临时生效的,如果需要长期有效,则调用Export-TabExpansionConfig功能保存配置。
    1-14  修改默认处理程序为智能提示并调用智能提示
如果需要把默认处理程序改回为ConsoleList,则执行与上面相反的操作。即首先将PowerTabConfig.DefaultHandler设置为ConsoleList,然后删除或注释PowerShell的配置文件$profile中有关加载默认处理程序为智能提示的部分,修改后必须调用Export-TabExpansionConfig保存。
PowerTab支持ConsoleListintelligence两种自动补全程序共存,它能够检测用户是否双击了Tab键。如果双击,则可以绑定不同的自动补全处理程序。此处理程序通过配置文件中AlternateHandler属性指定,这样即可ConsoleList处理程序与Tab键绑定,使intelligence与双击Tab键绑定。要设置该功能,必须按照一定规则设定处理程序属性。即通过设置DoubleTabEnabled的属性为$true来启动double-Tab功能,最后设置AlternateHandler属性指定双击Tab的处理程序。图1-15所示为使double-Tab功能有效的命令。
           图1-15  使double-tab功能有效的命令
如果需要这个设置,则必须调用Export-TabExpansionConfig命令保存配置。
3.2  Tab扩展数据库
Tab扩展数据库是包括所有项目的一个本地缓存,这些项目能以命令自动补全的方式返回。该数据库包括多种类型,默认为.NET类型的清单、WMI类,以及自定义匹配条目。使用这个数据库可以将这些自定义匹配条目作为代码片段,即用一个简单的关键字来保存一个长的字符串。只要键入这个关键字,即可得到长字符串。在同一关键字下可保存多个匹配,这样当需要一个关键字对应的匹配时可以得到一个选择列表。
可以通过添加add-TabExpansion函数来添加自定义的Tab扩展,需要关键字和扩展字符串两个参数。下面使用这一功能来创建一个属于自定义扩展列表,其中包括多个不同的文件路径,可以用其快速导航到需要的路径。图1-16所示为在清单中添加两个文件夹的代码。
              图1-16  在清单中添加两个文件夹的代码
PowerTab的自定义匹配语法为在脱字符号(^)后键入关键字,为了更快地导航到自定义列表,键入cd fav^[Tab]后可在弹出的列表中选择条目。
要在其他shell会话中应用该功能,必须调用Export-TabExpansionDataBase方法保存Tab扩展数据库的设置,如图1-17所示。
               图1-17  保存Tab扩展数据库的设置
4 小结
PowerTab是一个强大的工具,保存了多类型,能够极大地提高工作效率。可以肯定,一旦开始使用PowerTab,就再也不会使用PowerShell的默认的Tab扩展方法了。
本章总结了PowerShell的扩展方法,首先用简单的例子帮助读者理解Shell组件的工作原理,然后使用不同的语法技术,如.NETCOM WMI对象与操作系统和网络交互。最后介绍了最重要的并很容易获得且能够极大提高工作效率的工具。