Cmdlet 概述

cmdlet 是 PowerShell 环境中使用的轻型命令。 PowerShell 运行时在命令行提供的自动化脚本上下文中调用这些 cmdlet。 PowerShell 运行时还通过 PowerShell API 以编程方式调用它们。

Cmdlets(命令行小程序)

Cmdlet 执行作,通常将Microsoft .NET 对象返回到管道中的下一个命令。 cmdlet 是参与 PowerShell 管道语义的单个命令。 这包括二进制 (C#) cmdlet、高级脚本函数、CDXML 和工作流。

此 SDK 文档介绍如何创建用 C# 编写的二进制 cmdlet。 有关基于脚本的 cmdlet 的信息,请参阅:

若要创建二进制 cmdlet,必须实现派生自两个专用 cmdlet 基类之一的 cmdlet 类。 派生类必须:

  • 声明将派生类标识为 cmdlet 的属性。
  • 定义使用将公共属性标识为 cmdlet 参数的属性修饰的公共属性。
  • 重写一个或多个输入处理方法以处理记录。

可以使用 Import-Module cmdlet 直接加载包含类的程序集,也可以创建使用 System.Management.Automation.Runspaces.InitialSessionState API 加载程序集的主机应用程序。 这两种方法都提供对 cmdlet 功能的编程和命令行访问。

Cmdlet 术语

PowerShell cmdlet 文档中经常使用以下术语:

Cmdlet 属性

用于将 cmdlet 类声明为 cmdlet 的 .NET 属性。 尽管 PowerShell 使用其他几个可选属性,但需要 Cmdlet 属性。 有关此属性的详细信息,请参阅 Cmdlet 属性声明

Cmdlet 参数

用于定义可供用户或运行 cmdlet 的应用程序可用的参数的公共属性。 Cmdlet 可以具有必需、命名、位置和 开关 参数。 切换参数允许定义仅在调用中指定参数时计算的参数。 有关不同类型的参数的详细信息,请参阅 Cmdlet 参数

参数集

可在同一命令中使用的一组参数来执行特定作。 cmdlet 可以有多个参数集,但每个参数集必须至少有一个唯一的参数。 良好的 cmdlet 设计强烈建议唯一参数也是必需参数。 有关参数集的详细信息,请参阅 Cmdlet 参数集

动态参数

在运行时添加到 cmdlet 的参数。 通常,当另一个参数设置为特定值时,动态参数将添加到 cmdlet。 有关动态参数的详细信息,请参阅 Cmdlet 动态参数

输入处理方法

System.Management.Automation.Cmdlet 类提供用于处理记录的以下虚拟方法。 所有派生的 cmdlet 类必须重写前三种方法中的一个或多个:

有关这些方法的详细信息,请参阅 Cmdlet 输入处理方法

实现 cmdlet 时,必须至少重写其中一种输入处理方法。 通常,ProcessRecord() 是替代的方法,因为它针对 cmdlet 处理的每个记录调用。 相比之下,BeginProcessing() 方法和 EndProcessing() 方法调用一次来执行记录预处理或后处理。 有关这些方法的详细信息,请参阅 输入处理方法

ShouldProcess 功能

借助 PowerShell,可以创建 cmdlet,以便在 cmdlet 对系统进行更改之前提示用户提供反馈。 若要使用此功能,cmdlet 必须在声明 Cmdlet 属性时声明它支持 ShouldProcess 功能,并且 cmdlet 必须从输入处理方法中调用 System.Management.Automation.Cmdlet.ShouldProcessSystem.Management.Automation.Cmdlet.ShouldContinue 方法。 有关如何支持 ShouldProcess 功能的详细信息,请参阅 请求确认

交易

被视为单个任务的命令的逻辑组。 如果组中的任何命令失败,任务会自动失败,并且用户可以选择接受或拒绝事务中执行的作。 若要参与事务,cmdlet 必须在声明 Cmdlet 属性时声明它支持事务。 Windows PowerShell 2.0 中引入了对事务的支持。 有关事务的详细信息,请参阅 如何支持事务

Cmdlet 与命令有何不同

Cmdlet 与其他命令行界面环境中的命令不同,方法如下:

  • Cmdlet 是 .NET 类的实例;它们不是独立的可执行文件。
  • 可以从十几行代码创建 Cmdlet。
  • Cmdlet 通常不执行自己的分析、错误呈现或输出格式设置。 PowerShell 运行时处理分析、错误呈现和输出格式设置。
  • Cmdlet 处理来自管道的输入对象,而不是处理文本流的输入对象,cmdlet 通常将对象作为输出传送到管道。
  • Cmdlet 面向记录,因为它们一次处理单个对象。

Cmdlet 基类

Windows PowerShell 支持派生自以下两个基类的 cmdlet。

  • 大多数 cmdlet 都基于派生自 System.Management.Automation.Cmdlet 基类的 .NET 类。 从此类派生,cmdlet 允许在 Windows PowerShell 运行时上使用最小依赖项集。 这带来了两个好处。 第一个好处是 cmdlet 对象较小,并且不太可能受到 PowerShell 运行时更改的影响。 第二个好处是,如果需要,可以直接创建 cmdlet 对象的实例,然后直接调用它,而不是通过 PowerShell 运行时调用它。

  • 更复杂的 cmdlet 基于派生自 System.Management.Automation.PSCmdlet 基类的 .NET 类。 通过从此类派生,可以更多地访问 PowerShell 运行时。 此访问权限允许 cmdlet 调用脚本、访问提供程序以及访问当前会话状态。 (若要访问当前会话状态,可以获取和设置会话变量和首选项。但是,从此类派生会增大 cmdlet 对象的大小,这意味着 cmdlet 与 PowerShell 运行时的当前版本更紧密耦合。

通常,除非需要对 PowerShell 运行时进行扩展访问,否则应派生自 System.Management.Automation.Cmdlet 类。 但是,PowerShell 运行时具有用于执行 cmdlet 的大量日志记录功能。 如果审核模型依赖于此日志记录,可以通过 从 system.Management.Automation.PSCmdlet 类派生,防止在另一个 cmdlet 中执行 cmdlet。

Cmdlet 属性

PowerShell 定义了多个用于管理 cmdlet 的 .NET 属性,并指定 PowerShell 提供的常见功能,以及 cmdlet 可能需要的功能。 例如,属性用于将类指定为 cmdlet、指定 cmdlet 的参数以及请求输入验证,以便 cmdlet 开发人员不必在其 cmdlet 代码中实现该功能。 有关属性的详细信息,请参阅 PowerShell 属性

Cmdlet 名称

PowerShell 使用谓词名对命名 cmdlet。 例如,PowerShell 中包含的 Get-Command cmdlet 用于获取在命令行界面中注册的所有 cmdlet。 谓词标识 cmdlet 执行的作,名词标识 cmdlet 对其执行作的资源。

当 .NET 类声明为 cmdlet 时,将指定这些名称。 有关如何将 .NET 类声明为 cmdlet 的详细信息,请参阅 Cmdlet 属性声明

编写 Cmdlet 代码

本文档提供了两种方法来了解如何编写 cmdlet 代码。 如果想要查看代码而不进行太多解释,请参阅 cmdlet Code 示例。 如果更愿意详细了解代码,请参阅 GetProc 教程StopProc 教程,或 SelectStr 教程 主题。

有关编写 cmdlet 的准则的详细信息,请参阅 Cmdlet 开发指南

另请参阅

PowerShell Cmdlet 概念

编写 PowerShell Cmdlet

PowerShell SDK