다음을 통해 공유


Cmdlet에 매개 변수 집합 추가

매개 변수 집합에 대해 알아야 할 사항

Windows PowerShell은 매개 변수 집합을 함께 작동하는 매개 변수 그룹으로 정의합니다. cmdlet의 매개 변수를 그룹화하여 사용자가 지정하는 매개 변수 그룹에 따라 기능을 변경할 수 있는 단일 cmdlet을 만들 수 있습니다.

두 매개 변수 집합을 사용하여 다른 기능을 정의하는 cmdlet의 예는 Windows PowerShell에서 제공하는 Get-EventLog cmdlet입니다. 이 cmdlet은 사용자가 List 또는 LogName 매개 변수를 지정할 때 다른 정보를 반환합니다. LogName 매개 변수를 지정하면 cmdlet은 지정된 이벤트 로그의 이벤트에 대한 정보를 반환합니다. List 매개 변수를 지정하면 cmdlet은 로그 파일 자체에 대한 정보를 반환합니다(포함된 이벤트 정보가 아님). 이 경우 ListLogName 매개 변수는 두 개의 개별 매개 변수 집합을 식별합니다.

매개 변수 집합에 대해 기억해야 할 두 가지 중요한 점은 Windows PowerShell 런타임이 특정 입력에 대해 하나의 매개 변수 집합만 사용하고 각 매개 변수 집합에 해당 매개 변수 집합에 대해 고유한 매개 변수가 하나 이상 있어야 한다는 것입니다.

마지막 점을 설명하기 위해 이 Stop-Proc cmdlet은 ProcessName, ProcessIdInputObject세 가지 매개 변수 집합을 사용합니다. 이러한 각 매개 변수 집합에는 다른 매개 변수 집합에 없는 하나의 매개 변수가 있습니다. 매개 변수 집합은 다른 매개 변수를 공유할 수 있지만 cmdlet은 고유한 매개 변수 ProcessName, ProcessIdInputObject 사용하여 Windows PowerShell 런타임에서 사용해야 하는 매개 변수 집합을 식별합니다.

Cmdlet 클래스 선언

cmdlet 만들기의 첫 번째 단계는 항상 cmdlet의 이름을 지정하고 cmdlet을 구현하는 .NET 클래스를 선언하는 것입니다. 이 cmdlet의 경우 cmdlet이 시스템 프로세스를 중지하기 때문에 수명 주기 동사 "Stop"이 사용됩니다. cmdlet이 프로세스에서 작동하기 때문에 명사 이름 "Proc"가 사용됩니다. 아래 선언에서 cmdlet 동사와 명사 이름은 cmdlet 클래스의 이름에 반영됩니다.

비고

승인된 cmdlet 동사 이름에 대한 자세한 내용은 Cmdlet 동사 이름참조하세요.

다음 코드는 이 Stop-Proc cmdlet에 대한 클래스 정의입니다.

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        DefaultParameterSetName = "ProcessId",
        SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
    Inherits PSCmdlet

Cmdlet의 매개 변수 선언

이 cmdlet은 cmdlet에 대한 입력으로 필요한 세 개의 매개 변수(이러한 매개 변수는 매개 변수 집합도 정의)뿐만 아니라 cmdlet이 수행하는 작업을 관리하는 Force 매개 변수와 cmdlet이 파이프라인을 통해 출력 개체를 보내는지 여부를 결정하는 PassThru 매개 변수를 정의합니다. 기본적으로 이 cmdlet은 파이프라인을 통해 개체를 전달하지 않습니다. 이러한 마지막 두 매개 변수에 대한 자세한 내용은 시스템수정하는 Cmdlet 만들기를 참조하세요.

이름 매개 변수 선언

이 입력 매개 변수를 사용하면 사용자가 중지할 프로세스의 이름을 지정할 수 있습니다. System.Management.Automation.ParameterAttribute 특성의 ParameterSetName 특성 키워드는 이 매개 변수에 대해 설정된 ProcessName 매개 변수를 지정합니다.

[Parameter(
   Position = 0,
   ParameterSetName = "ProcessName",
   Mandatory = true,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true,
   HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
    get { return processNames; }
    set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
    "Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
    Get
        Return processNames
    End Get
    Set(ByVal value As String())
        processNames = value
    End Set
End Property

Private processNames() As String

또한 이 매개 변수에는 별칭 "ProcessName"이 지정됩니다.

ID 매개 변수 선언

이 입력 매개 변수를 사용하면 사용자가 중지할 프로세스의 식별자를 지정할 수 있습니다. System.Management.Automation.ParameterAttribute 특성의 ParameterSetName 특성 키워드는 ProcessId 매개 변수 집합을 지정합니다.

[Parameter(
           ParameterSetName = "ProcessId",
           Mandatory = true,
           ValueFromPipelineByPropertyName = true,
           ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
  get { return processIds; }
  set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
    Get
        Return processIds
    End Get
    Set(ByVal value As Integer())
        processIds = value
    End Set
End Property
Private processIds() As Integer

또한 이 매개 변수에는 별칭 "ProcessId"가 지정됩니다.

InputObject 매개 변수 선언

이 입력 매개 변수를 사용하면 사용자가 중지할 프로세스에 대한 정보를 포함하는 입력 개체를 지정할 수 있습니다. System.Management.Automation.ParameterAttribute 특성의 ParameterSetName 특성 키워드는 이 매개 변수에 대해 설정된 InputObject 매개 변수를 지정합니다.

[Parameter(
           ParameterSetName = "InputObject",
           Mandatory = true,
           ValueFromPipeline = true)]
public Process[] InputObject
{
  get { return inputObject; }
  set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
    Get
        Return myInputObject
    End Get
    Set(ByVal value As Process())
        myInputObject = value
    End Set
End Property
Private myInputObject() As Process

또한 이 매개 변수에는 별칭이 없습니다.

여러 매개 변수 집합에서 매개 변수 선언

각 매개 변수 집합에 대해 고유한 매개 변수가 있어야 하지만 매개 변수는 둘 이상의 매개 변수 집합에 속할 수 있습니다. 이러한 경우 공유 매개 변수에 System.Management.Automation.ParameterAttribute 매개 변수가 속한 각 집합에 대한 특성 선언을 제공합니다. 매개 변수가 모든 매개 변수 집합에 있는 경우 매개 변수 특성을 한 번만 선언하면 되며 매개 변수 집합 이름을 지정할 필요가 없습니다.

입력 처리 방법 재정의

모든 cmdlet은 입력 처리 방법을 재정의해야 하며, 대부분 system.Management.Automation.Cmdlet.ProcessRecord 메서드에. 이 cmdlet에서 System.Management.Automation.Cmdlet.ProcessRecord 메서드가 재정의되어 cmdlet에서 여러 프로세스를 처리할 수 있습니다. 여기에는 사용자가 지정한 매개 변수 집합에 따라 다른 메서드를 호출하는 Select 문이 포함되어 있습니다.

protected override void ProcessRecord()
{
  switch (ParameterSetName)
  {
    case "ProcessName":
         ProcessByName();
         break;

    case "ProcessId":
         ProcessById();
         break;

    case "InputObject":
         foreach (Process process in inputObject)
         {
           SafeStopProcess(process);
         }
         break;

    default:
         throw new ArgumentException("Bad ParameterSet Name");
  } // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
    Select Case ParameterSetName
        Case "ProcessName"
            ProcessByName()

        Case "ProcessId"
            ProcessById()

        Case "InputObject"
            Dim process As Process
            For Each process In myInputObject
                SafeStopProcess(process)
            Next process

        Case Else
            Throw New ArgumentException("Bad ParameterSet Name")
    End Select

End Sub 'ProcessRecord ' ProcessRecord

Select 문에서 호출하는 도우미 메서드는 여기에 설명되어 있지 않지만 다음 섹션의 전체 코드 샘플에서 해당 구현을 볼 수 있습니다.

코드 샘플

전체 C# 샘플 코드는 StopProcessSample04 샘플참조하세요.

개체 형식 및 서식 정의

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

Cmdlet 빌드

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

Cmdlet 테스트

cmdlet이 Windows PowerShell에 등록되면 명령줄에서 실행하여 테스트합니다. 다음은 ProcessIdInputObject 매개 변수를 사용하여 매개 변수 집합을 테스트하여 프로세스를 중지하는 방법을 보여 주는 몇 가지 테스트입니다.

  • Windows PowerShell이 시작되면 ProcessId 매개 변수가 설정된 Stop-Proc cmdlet을 실행하여 식별자에 따라 프로세스를 중지합니다. 이 경우 cmdlet은 ProcessId 매개 변수 집합을 사용하여 프로세스를 중지합니다.

    PS> Stop-Proc -Id 444
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • Windows PowerShell이 시작되면 InputObject 매개 변수가 설정된 Stop-Proc cmdlet을 실행하여 Get-Process 명령으로 검색된 메모장 개체의 프로세스를 중지합니다.

    PS> Get-Process notepad | Stop-Proc
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

또한 참조하십시오

시스템 수정하는 Cmdlet 만들기

Windows PowerShell Cmdlet 만드는 방법

개체 형식 확장 및 서식

Cmdlet, 공급자 및 호스트 애플리케이션 등록하는 방법

Windows PowerShell SDK