在PowerShell中编写自定义的Cmdlet是一种强大的扩展方式,可以让用户根据自己的需求定制命令行工具。一旦编写了自己的Cmdlet,下一步就是考虑如何安装和注册它。本文将详细解释这个过程。
要注册自定义的Cmdlet,需要编写一个PowerShellSnap-in。这通常涉及到创建一个新的类,该类继承自CustomPSSnapIn
或PSSnapIn
。两者的主要区别在于,继承自PSSnapIn
的Snap-in会自动注册程序集中的所有Cmdlet,而继承自CustomPSSnapIn
的Snap-in则允许选择性地注册Cmdlet。如果只开发了一个Cmdlet,可以直接继承PSSnapIn
。但如果程序集中有多个Cmdlet,并且不想一次性注册所有Cmdlet,那么应该选择继承CustomPSSnapIn
。
以下是一个示例代码,展示了如何创建一个继承自CustomPSSnapIn
的类:
public class AmazonPSSnapIn : CustomPSSnapIn
{
// 实现必要的属性
}
当继承自CustomPSSnapIn
时,需要实现以下四个属性:
这个属性期望返回一个泛型集合Collection
给安装程序。
CmdletConfigurationEntry允许定义Snap-in的配置。至少,需要提供以下三个数据:
CmdletConfigurationEntry
对象中需要设置的最重要的属性。在这里定义了实现Cmdlet的.NET对象的类型。以下代码展示了如何实现Cmdlets属性来注册程序集中的三个Cmdlet:
public override Collection<CmdletConfigurationEntry> Cmdlets
{
get
{
if (null == _cmdlets)
{
_cmdlets = new Collection<CmdletConfigurationEntry>();
_cmdlets.Add(new CmdletConfigurationEntry("Get-Book", typeof(GetBookCommand), "AmazonPS.dll-Help.xml"));
_cmdlets.Add(new CmdletConfigurationEntry("Get-DVD", typeof(GetDVDCommand), "AmazonPS.dll-Help.xml"));
_cmdlets.Add(new CmdletConfigurationEntry("Get-DigitalMusic", typeof(GetDigitalMusicCommand), "AmazonPS.dll-Help.xml"));
}
return _cmdlets;
}
}
编译Cmdlet项目。在PowerShell命令窗口中执行以下操作(按照文档中的步骤):
PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil
PS> installutil MyCustomCmdlets.dll
一旦成功执行了上述步骤,可以通过执行以下命令来验证Snap-in是否已注册:
get-PSsnapin -registered
现在Snap-in已经注册,可以通过执行以下命令将其添加到PowerShell中:
add-pssnapin MyCustomSnapIn
一旦关闭PowerShell命令窗口,添加过程将会丢失。但是,Snap-in注册不会丢失。这意味着下次启动PowerShell命令窗口时,需要再次执行add-pssnapin
命令来使用Cmdlet。为了解决这个问题,可以在添加Snap-in后将shell配置导出到文件中。在后续的会话中,可以使用该配置,这样自定义Cmdlet就已经添加到shell中了。
export-console MyCustomCmdletPowerShell
如果需要升级自定义Cmdlet,可能想要从shell中移除它。可以执行以下命令来移除它:
remove-PSSnapin MyCustomSnapIn
确保使用的名称与添加它时使用的名称相匹配。否则,shell会抛出错误,告诉找不到这个Snap-in。如果想安装更新的副本,从shell中注销Snap-in是非常重要的。在PowerShell命令提示符下执行以下操作以注销:
PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil
PS> installutil /u MyCustomCmdlets.dll