65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (4投票s)

2009年2月10日

CPOL

4分钟阅读

viewsIcon

44129

如何为您的自定义 Cmdlet 编写 PowerShell snap-in。

引言

《如何编写自定义 PowerShell Cmdlet - 第一部分》中,我讨论了编写自定义 Cmdlet 的第一步。现在您已经编写了 Cmdlet,您需要弄清楚如何安装它。我将在本文中进行解释。

您将编写一个 PowerShell Snap-in 来注册您的自定义 Cmdlet。这是通过创建一个派生自 CustomPSSnapInPSSnapIn 的新类来完成的。从高层次来看,两者的区别在于,派生自 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

此属性要求您向安装程序实用程序返回一个泛型集合 CollectionCmdletConfigurationEntry 允许您定义 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 的输出视图。

© . All rights reserved.