如何编写自定义 PowerShell Cmdlet - 第二部分






4.67/5 (4投票s)
如何为您的自定义 Cmdlet 编写 PowerShell snap-in。
引言
在《如何编写自定义 PowerShell Cmdlet - 第一部分》中,我讨论了编写自定义 Cmdlet 的第一步。现在您已经编写了 Cmdlet,您需要弄清楚如何安装它。我将在本文中进行解释。
您将编写一个 PowerShell Snap-in 来注册您的自定义 Cmdlet。这是通过创建一个派生自 CustomPSSnapIn
或 PSSnapIn
的新类来完成的。从高层次来看,两者的区别在于,派生自 PSSnapIn
类的 snap-in 会注册您程序集中的所有 Cmdlet。而派生自 CustomPSSnapIn
的 snap-in 则允许您灵活地选择要注册程序集中哪些 Cmdlet。如果您只开发一个 Cmdlet,那么您可以直接派生自 PSSnapIn
,让它处理有关选择注册内容的细节。但是,如果您在一个程序集中开发多个 Cmdlet,并且还没有准备好注册所有 Cmdlet,并希望有所选择,那么您应该派生自 CustomPSSnapIn
类。所以,对于我的示例 Cmdlet,我有多个 Cmdlet,其中一些还没有准备好投入使用。因此,我将我的 snap-in 派生自 CustomPSSnapIn
。
public class AmazonPSSnapIn : CustomPSSnapIn {...}
当您派生自 CustomPSSnapIn
时,有四个属性需要实现。
Description
:在此处提供您的 snap-in 的简短描述。Name
:在此处提供您的 snap-in 的名称。Vendor
:在此处提供您的 snap-in 的供应商信息。Cmdlets
:在这里,您将提供需要注册的 Cmdlet 集合。我将在接下来的内容中详细讨论。
Cmdlets
此属性要求您向安装程序实用程序返回一个泛型集合 Collection
。CmdletConfigurationEntry
允许您定义 snap-in 的配置。至少,您需要向此对象提供以下三项数据。
Name
:这是一个非常重要的参数,您可以在其中指定用户将如何识别您的 Cmdlet 的名称。在我的示例中,对于一个 Cmdlet,我选择了名称 Get-Book。用户通过调用此命令来执行图书搜索。ImplementingType
:这是您需要为CmdletConfigurationEntry
对象设置的最重要的属性。在这里,您定义了拥有 Cmdlet 实现的 .NET 对象的类型。HelpFileName
:您将在此处设置包含 Cmdlet 帮助信息的文件名。此属性不像前两个那样关键,因为您的 Cmdlet 在没有帮助信息的情况下也可以工作。您只需确保用户知道如何使用您的 Cmdlet。但是,为您的 Cmdlet 提供帮助信息很重要。这样,用户就可以调用 get-help {cmdname} 来获取 Cmdlet 的帮助。我将在下一篇文章中解释如何为 Cmdlet 编写帮助文件。
以下代码片段显示了我如何实现 Cmdlets
属性来注册程序集中的三个 Cmdlet。
public override Collection Cmdlets
{
get
{
if (null == _cmdlets)
{
_cmdlets = new Collection();
_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
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Running a transacted installation.
…
The transacted install has completed.
验证注册
成功执行上述步骤后,您可以通过从 PowerShell 窗口执行以下命令来验证您的 snap-in 是否已注册:
get-PSsnapin -registered
添加 snap-in 以使用它
现在 snap-in 已注册,您将进入最后一步,将您的 snap-in 添加到 PowerShell 中以开始使用它。从 PowerShell 执行以下命令以添加您的 snap-in:
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。如果您想安装更新版本的自定义 Cmdlet,将其从 shell 中注销非常重要。在 PowerShell 命令提示符下执行以下操作进行注销:
PS> set-alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil
PS> installutil /u MyCustomCmdlets.dll
请注意,此步骤与您为注册执行的步骤相同。区别在于您为 InstallUtil 命令指定了一个 /u 参数。
在我的下一篇文章中,我将讨论如何编写配置文件来自定义 Cmdlet 的输出视图。