다음을 통해 공유


명령줄 입력을 처리하는 매개 변수 추가

cmdlet에 대한 입력 소스 중 하나는 명령줄입니다. 이 항목에서는 cmdlet이 cmdlet에 전달된 명시적 개체를 기반으로 로컬 컴퓨터에서 입력을 처리할 수 있도록 Get-Proc cmdlet(첫 번째 cmdlet만들기에 설명됨)에 매개 변수를 추가하는 방법에 대해 설명합니다. 여기에 설명된 Get-Proc cmdlet은 이름에 따라 프로세스를 검색한 다음 명령 프롬프트에 프로세스에 대한 정보를 표시합니다.

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의 이름이고 MemberTypeGet-Member cmdlet의 매개 변수입니다. 매개 변수에는 "property" 인수가 있습니다.

PS> Get-Proc ; Get-Member -MemberType 속성

cmdlet에 대한 매개 변수를 선언하려면 먼저 매개 변수를 나타내는 속성을 정의해야 합니다. Get-Proc cmdlet에서 유일한 매개 변수는 Name. 이 경우 검색할 .NET Framework 프로세스 개체의 이름을 나타냅니다. 따라서 cmdlet 클래스는 이름 배열을 허용하는 문자열 형식의 속성을 정의합니다.

다음은 Get-Proc cmdlet의 Name 매개 변수에 대한 매개 변수 선언입니다.

/// <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

이 속성이 Name 매개 변수임을 Windows PowerShell 런타임에 알리기 위해 System.Management.Automation.ParameterAttribute 특성이 속성 정의에 추가됩니다. 이 특성을 선언하기 위한 기본 구문은 [Parameter()].

비고

매개 변수는 명시적으로 public으로 표시되어야 합니다. 공용 기본값으로 내부로 표시되지 않고 Windows PowerShell 런타임에서 찾을 수 없는 매개 변수입니다.

이 cmdlet은 Name 매개 변수에 문자열 배열을 사용합니다. 가능하면 cmdlet이 둘 이상의 항목을 수락할 수 있으므로 매개 변수를 배열로 정의해야 합니다.

매개 변수 정의에 대해 기억해야 할 사항

  • 미리 정의된 Windows PowerShell 매개 변수 이름 및 데이터 형식을 최대한 재사용하여 cmdlet이 Windows PowerShell cmdlet과 호환되도록 해야 합니다. 예를 들어 모든 cmdlet이 미리 정의된 Id 매개 변수 이름을 사용하여 리소스를 식별하는 경우 사용자는 사용 중인 cmdlet에 관계없이 매개 변수의 의미를 쉽게 이해할 수 있습니다. 기본적으로 매개 변수 이름은 CLR(공용 언어 런타임)의 변수 이름에 사용되는 것과 동일한 규칙을 따릅니다. 매개 변수 이름 지정에 대한 자세한 내용은 Cmdlet 매개 변수 이름참조하세요.

  • Windows PowerShell은 일관된 사용자 환경을 제공하기 위해 몇 가지 매개 변수 이름을 예약합니다. WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariableOutBuffer매개 변수 이름을 사용하지 마세요. 또한 이러한 매개 변수 이름에 대한 별칭은 vb, db, ea, ev, ovob예약되어 있습니다.

  • Name cmdlet에서 사용하기 위해 권장되는 간단하고 일반적인 매개 변수 이름입니다. 특정 cmdlet에 고유하고 기억하기 어려운 복잡한 이름보다 이와 같은 매개 변수 이름을 선택하는 것이 좋습니다.

  • 기본적으로 셸은 대/소문자를 유지하지만 매개 변수는 Windows PowerShell에서 대/소문자를 구분하지 않습니다. 인수의 대/소문자 구분은 cmdlet의 작업에 따라 달라집니다. 인수는 명령줄에 지정된 대로 매개 변수에 전달됩니다.

  • 다른 매개 변수 선언의 예는 Cmdlet 매개 변수참조하세요.

매개 변수를 위치 또는 명명됨으로 선언

cmdlet은 각 매개 변수를 위치 또는 명명된 매개 변수로 설정해야 합니다. 두 종류의 매개 변수는 모두 단일 인수, 쉼표로 구분된 여러 인수 및 부울 설정을 허용합니다. 스위치라고도 하는 부울 매개 변수는 부울 설정만 처리합니다. 스위치는 매개 변수의 존재를 확인하는 데 사용됩니다. 권장되는 기본값은 false.

샘플 Get-Proc cmdlet은 Name 매개 변수를 위치 0이 있는 위치 매개 변수로 정의합니다. 즉, 사용자가 명령줄에 입력하는 첫 번째 인수가 이 매개 변수에 대해 자동으로 삽입됩니다. 사용자가 명령줄에서 매개 변수 이름을 지정해야 하는 명명된 매개 변수를 정의하려면 Position 키워드를 특성 선언에서 제외합니다.

비고

매개 변수의 이름을 지정하지 않는 한 사용자가 매개 변수 이름을 입력할 필요가 없도록 가장 많이 사용되는 매개 변수 위치를 지정하는 것이 좋습니다.

매개 변수를 필수 또는 선택 사항으로 선언

cmdlet은 각 매개 변수를 선택적 매개 변수 또는 필수 매개 변수로 설정해야 합니다. 샘플 Get-Proc cmdlet에서 Name 매개 변수는 Mandatory 키워드가 특성 선언에 설정되지 않았기 때문에 선택 사항으로 정의됩니다.

매개 변수 유효성 검사 지원

샘플 Get-Proc cmdlet은 입력이 null 않고 비어 있지 않은지 유효성을 검사할 수 있도록 system.Management.Automation.ValidateNotNullOrEmptyAttribute 입력 유효성 검사 특성을 Name 매개 변수에 추가합니다. 이 특성은 Windows PowerShell에서 제공하는 여러 유효성 검사 특성 중 하나입니다. 다른 유효성 검사 특성의 예는 매개 변수 입력 유효성 검사참조하세요.

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

입력 처리 방법 재정의

cmdlet이 명령줄 입력을 처리하는 경우 적절한 입력 처리 방법을 재정의해야 합니다. 기본 입력 처리 방법은 첫 번째 Cmdlet 만들기도입되었습니다.

Get-Proc cmdlet은 System.Management.Automation.Cmdlet.ProcessRecord 메서드를 재정의하여 사용자 또는 스크립트에서 제공하는 Name 매개 변수 입력을 처리합니다. 이 메서드는 요청된 각 프로세스 이름에 대한 프로세스를 가져오거나 이름이 제공되지 않은 경우 프로세스에 대한 모든 프로세스를 가져옵니다. system.Management.Automation.Cmdlet.ProcessRecord System.Management.Automation.Cmdlet.WriteObject 호출은 출력 개체를 파이프라인으로 보내는 출력 메커니즘입니다. 이 호출의 두 번째 매개 변수인 enumerateCollectiontrue 설정되어 Windows PowerShell 런타임에 프로세스 개체의 출력 배열을 열거하고 명령줄에 한 번에 하나의 프로세스를 작성하도록 알릴 수 있습니다.

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은 .NET Framework 개체를 사용하여 cmdlet 간에 정보를 전달합니다. 따라서 cmdlet은 자체 형식을 정의해야 하거나 cmdlet이 다른 cmdlet에서 제공하는 기존 형식을 확장해야 할 수 있습니다. 새 형식을 정의하거나 기존 형식을 확장하는 방법에 대한 자세한 내용은 개체 형식 확장 및 서식참조하세요.

Cmdlet 빌드

cmdlet을 구현한 후 Windows PowerShell 스냅인을 사용하여 Windows PowerShell에 등록해야 합니다. cmdlet 등록에 대한 자세한 내용은 Cmdlet, 공급자 및 호스트 애플리케이션등록하는 방법을 참조하세요.

Cmdlet 테스트

cmdlet이 Windows PowerShell에 등록되면 명령줄에서 실행하여 테스트할 수 있습니다. 다음은 샘플 cmdlet에 대한 코드를 테스트하는 두 가지 방법입니다. 명령줄에서 cmdlet을 사용하는 방법에 대한 자세한 내용은 windows PowerShell 시작하기참조하세요.

  • Windows PowerShell 프롬프트에서 다음 명령을 사용하여 "IEXPLORE"라는 Internet Explorer 프로세스를 나열합니다.

    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
    
  • "IEXPLORE", "OUTLOOK" 및 "NOTEPAD"라는 Internet Explorer, Outlook 및 메모장 프로세스를 나열하려면 다음 명령을 사용합니다. 여러 프로세스가 있는 경우 모든 프로세스가 표시됩니다.

    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 샘플