添加用于处理命令行输入的参数

cmdlet 的输入源之一是命令行。 本主题介绍如何将参数添加到 cmdlet (创建第一个 Cmdlet) 中介绍了该参数,以便 cmdlet 可以基于传递给 Get-Proc cmdlet 的显式对象处理来自本地计算机的输入。 此处所述的 cmdlet 根据进程的名称检索进程,然后在命令提示符 Get-Proc 下显示有关进程的信息。

定义 Cmdlet 类

cmdlet 创建的第一步是 cmdlet 命名和实现 cmdlet 的 .NET Framework 类的声明。 此 cmdlet 检索进程信息,因此此处选择的谓词名称为"Get"。 (几乎任何能够检索信息的 cmdlet 都可以处理命令行输入。) 有关已批准的 cmdlet 谓词的信息,请参阅 Cmdlet 谓词名称

下面是 Get-Proc cmdlet 的类声明。 有关此定义的详细信息,请参阅 创建第一个 Cmdlet

[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand: Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

声明参数

cmdlet 参数使用户能够向 cmdlet 提供输入。 在下面的示例中, Get-ProcGet-Member 是管道 cmdlet 的名称,是 MemberType Get-Member cmdlet 的参数。 参数具有参数"property"。

PS> get-proc ; get-member -membertype 属性

若要声明 cmdlet 的参数,必须先定义表示参数的属性。 在 cmdlet 中,唯一的参数是 ,在这种情况下,它表示要检索.NET Framework Get-Proc Name 对象的名称。 因此,cmdlet 类定义字符串类型的属性以接受名称数组。

下面是 Name cmdlet 的 参数的参数 Get-Proc 声明。

/// <summary>
/// Specify the cmdlet Name parameter.
/// </summary>
  [Parameter(Position = 0)]
  [ValidateNotNullOrEmpty]
  public string[] Name
  {
    get { return processNames; }
    set { processNames = value; }
  }
  private string[] processNames;

  #endregion Parameters
<Parameter(Position:=0), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
    Get
        Return processNames
    End Get

    Set(ByVal value As String())
        processNames = value
    End Set

End Property

若要通知 Windows PowerShell运行时此属性是 参数,将 Name System.Management.Automation.Parameterattribute属性添加到属性定义。 声明此属性的基本语法为 [Parameter()]

备注

参数必须显式标记为 public。 未标记为内部默认公共参数且运行时找不到Windows PowerShell参数。

此 cmdlet 对 参数使用字符串 Name 数组。 如果可能,cmdlet 还应将参数定义为数组,因为这允许 cmdlet 接受多个项。

关于参数定义的需要记住的一些内容

  • 应Windows PowerShell重用预定义参数名称和数据类型,以确保 cmdlet 与 Windows PowerShell cmdlet 兼容。 例如,如果所有 cmdlet 都使用预定义的参数名称来标识资源,则无论用户使用什么 cmdlet,用户都可以轻松理解参数 Id 的含义。 基本上,参数名称遵循的规则与 CLR 语言运行时中用于变量名称的规则 (相同) 。 有关参数命名详细信息,请参阅 Cmdlet 参数名称

  • Windows PowerShell保留几个参数名称,以提供一致的用户体验。 请勿使用这些参数名称 WhatIf Confirm Verbose Debug Warn :、、、、、 ErrorActionErrorVariable OutVariable OutBuffer 。 此外,这些参数名称的以下别名是保留的 vb :、、 db eaev ov ob

  • Name 是一个简单的通用参数名称,建议在 cmdlet 中使用。 选择这样的参数名称比选择特定于特定 cmdlet 且难以记住的复杂名称更好。

  • 尽管默认情况下 shell 保留大小写,但Windows PowerShell参数不区分大小写。 参数的区分大小写取决于 cmdlet 的操作。 参数将传递到命令行中指定的参数。

  • 有关其他参数声明的示例,请参阅 Cmdlet 参数

将参数声明为位置参数或命名参数

cmdlet 必须将每个参数设置为位置参数或命名参数。 这两种类型的参数都接受单个参数、多个用逗号分隔的参数和布尔设置。 布尔参数( 也称为开关) 仅处理布尔设置。 开关用于确定参数是否存在。 建议的默认值为 false

示例 Get-Proc cmdlet 将 参数 Name 定义为具有位置的位置参数 0. 这意味着会自动为此参数插入用户在命令行上输入的第一个参数。 如果要定义命名参数(用户必须从命令行指定参数名称)时,将 关键字 Position 保留为属性声明外。

备注

除非必须命名参数,否则我们建议将最常用的参数定位,以便用户不需要键入参数名称。

将参数声明为必需或可选

cmdlet 必须将每个参数设置为可选参数或必需参数。 在示例 Get-Proc cmdlet 中,参数定义为可选 Name ,因为 Mandatory 属性声明中未设置 关键字。

支持参数验证

示例 Get-Proc cmdlet 将输入验证属性 System.Management.Automation.Validatenotnulloremptyattribute添加到 参数,以启用输入既不是 输入也不是 Name null 空的验证。 此属性是由 Windows PowerShell 提供的多个验证属性之一。 有关其他验证属性的示例,请参阅 验证参数输入

[Parameter(Position = 0)]
[ValidateNotNullOrEmpty]
public string[] Name

重写输入处理方法

如果 cmdlet 要处理命令行输入,则必须重写相应的输入处理方法。 创建第一个 Cmdlet 中引入了基本的输入处理方法

Get-Proccmdlet 重写System.Management.Automation.Cmdlet.ProcessRecord方法以处理用户或脚本 Name 提供的参数输入。 此方法获取每个请求的进程名称的进程;如果未提供名称,则获取所有进程的进程。 请注意, 在 System.Management.Automation.Cmdlet.ProcessRecord中,对 System.Management.Automation.Cmdlet.WriteObject%28System.Object%2CSystem.Boolean%29 的调用是输出机制,用于将输出对象发送到管道。 此调用的第二个参数 设置为 ,以通知 Windows PowerShell 运行时枚举进程对象的输出数组,并一次将一个进程 enumerateCollection true 写入命令行。

protected override void ProcessRecord()
{
  // If no process names are passed to the cmdlet, get all processes.
  if (processNames == null)
  {
    // Write the processes to the pipeline making them available
    // to the next cmdlet. The second argument of this call tells
    // PowerShell to enumerate the array, and send one process at a
    // time to the pipeline.
    WriteObject(Process.GetProcesses(), true);
  }
  else
  {
    // If process names are passed to the cmdlet, get and write
    // the associated processes.
    foreach (string name in processNames)
    {
      WriteObject(Process.GetProcessesByName(name), true);
    }
  }
}
Protected Overrides Sub ProcessRecord()

    '/ If no process names are passed to the cmdlet, get all processes.
    If processNames Is Nothing Then
        Dim processes As Process()
        processes = Process.GetProcesses()
    End If

    '/ If process names are specified, write the processes to the
    '/ pipeline to display them or make them available to the next cmdlet.

    For Each name As String In processNames
        '/ The second parameter of this call tells PowerShell to enumerate the
        '/ array, and send one process at a time to the pipeline.
        WriteObject(Process.GetProcessesByName(name), True)
    Next

End Sub 'ProcessRecord

代码示例

有关完整的 C# 示例代码,请参阅 GetProcessSample02 示例

定义对象类型和格式设置

Windows PowerShell对象在 cmdlet 之间.NET Framework信息。 因此,cmdlet 可能需要定义自己的类型,或者 cmdlet 可能需要扩展另一个 cmdlet 提供的现有类型。 有关定义新类型或扩展现有类型的信息,请参阅 扩展对象类型和格式设置。

生成 Cmdlet

实现 cmdlet 后,必须使用 Windows PowerShell 管理单元Windows PowerShell它。 有关注册 cmdlet 的信息,请参阅 如何注册 Cmdlet、提供程序和主机应用程序

测试 Cmdlet

将 cmdlet 注册到 Windows PowerShell,可以通过在命令行上运行它来测试它。 下面是测试示例 cmdlet 代码的两种方法。 有关从命令行使用 cmdlet 的信息,请参阅 入门Windows PowerShell。

  • 在Windows PowerShell,使用以下命令列出名为Internet Explorer IEXPLORE"的进程。

    get-proc -name iexplore
    

    将显示以下输出。

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----   ------ --   -----------
        354      11  10036   18992    85   0.67   3284   iexplore
    
  • 若要列出Internet Explorer、Outlook记事本"IEXPLORE"、"OUTLOOK"和"NOTEPAD"的进程,请使用以下命令。 如果有多个进程,则显示所有进程。

    get-proc -name iexplore, outlook, notepad
    

    将显示以下输出。

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)   Id   ProcessName
    -------  ------  -----   -----  -----  ------   --   -----------
        732      21  24696    5000    138   2.25  2288   iexplore
        715      19  20556   14116    136   1.78  3860   iexplore
       3917      62  74096   58112    468 191.56  1848   OUTLOOK
         39       2   1024    3280     30   0.09  1444   notepad
         39       2   1024     356     30   0.08  3396   notepad
    

另请参阅

添加用于处理管道输入的参数

创建第一个 Cmdlet

扩展对象类型和格式设置

如何注册 Cmdlet、提供程序和主机应用程序

Windows PowerShell 参考

Cmdlet 示例