다음을 통해 공유


매개 변수 없이 Cmdlet 만들기

이 섹션에서는 매개 변수를 사용하지 않고 로컬 컴퓨터에서 정보를 검색한 다음 파이프라인에 정보를 기록하는 cmdlet을 만드는 방법을 설명합니다. 여기에 설명된 cmdlet은 로컬 컴퓨터의 프로세스에 대한 정보를 검색한 다음 명령줄에 해당 정보를 표시하는 Get-Proc cmdlet입니다.

비고

cmdlet을 작성할 때 Windows PowerShell® 참조 어셈블리는 디스크에 다운로드됩니다(기본적으로 C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). GAC(전역 어셈블리 캐시)에 설치되지 않습니다.

Cmdlet 이름 지정

cmdlet 이름은 cmdlet이 수행하는 동작을 나타내는 동사와 cmdlet이 작동하는 항목을 나타내는 명사로 구성됩니다. 이 샘플 Get-Proc cmdlet은 프로세스 개체를 검색하기 때문에 System.Management.Automation.VerbsCommon 열거형으로 정의된 동사 "Get"과 명사 "Proc"를 사용하여 cmdlet이 프로세스 항목에서 작동함을 나타냅니다.

cmdlet의 이름을 지정할 때 # , () {} [] & - /\ $ ; : " '<> | ? @ ` .

명사 선택

특정 명사 선택해야 합니다. 제품 이름의 단축된 버전 접두사로 접두사로 지정된 단수 명사를 사용하는 것이 가장 좋습니다. 이 형식의 예제 cmdlet 이름은 "Get-SQLServer"입니다.

동사 선택

승인된 cmdlet 동사 이름 집합의 동사를 사용해야 합니다. 승인된 cmdlet 동사에 대한 자세한 내용은 Cmdlet 동사 이름참조하세요.

Cmdlet 클래스 정의

cmdlet 이름을 선택한 후에는 .NET 클래스를 정의하여 cmdlet을 구현합니다. 다음은 이 샘플 Get-Proc cmdlet에 대한 클래스 정의입니다.

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

클래스 정의 이전의 System.Management.Automation.CmdletAttribute 특성(구문 [Cmdlet(verb, noun, ...)])은 이 클래스를 cmdlet으로 식별하는 데 사용됩니다. 이는 모든 cmdlet에 필요한 유일한 특성이며 Windows PowerShell 런타임에서 올바르게 호출할 수 있습니다. 필요한 경우 클래스를 추가로 선언하도록 특성 키워드를 설정할 수 있습니다. 샘플 GetProcCommand 클래스에 대한 특성 선언은 Get-Proc cmdlet의 명사 및 동사 이름만 선언합니다.

비고

모든 Windows PowerShell 특성 클래스의 경우 설정할 수 있는 키워드는 특성 클래스의 속성에 해당합니다.

cmdlet의 클래스 이름을 지정할 때 클래스 이름에 cmdlet 이름을 반영하는 것이 좋습니다. 이렇게 하려면 "VerbNounCommand" 형식을 사용하고 "동사" 및 "명사"를 cmdlet 이름에 사용되는 동사와 명사로 바꿉니다. 이전 클래스 정의에 표시된 것처럼 샘플 Get-Proc cmdlet은 기본 클래스를 System.Management.Automation.Cmdlet에서 파생되는 GetProcCommand라는 클래스를 정의합니다.

중요합니다

Windows PowerShell 런타임에 직접 액세스하는 cmdlet을 정의하려는 경우 .NET 클래스는 System.Management.Automation.PSCmdlet 기본 클래스에서 파생되어야 합니다. 이 클래스에 대한 자세한 내용은 매개 변수 집합정의하는 Cmdlet 만들기를 참조하세요.

비고

cmdlet에 대한 클래스는 명시적으로 public으로 표시되어야 합니다. 공용으로 표시되지 않은 클래스는 기본적으로 내부로 설정되며 Windows PowerShell 런타임에서는 찾을 수 없습니다.

Windows PowerShell은 cmdlet 클래스에 Microsoft.PowerShell.Commands 네임스페이스를 사용합니다. cmdlet 클래스를 API 네임스페이스의 Commands 네임스페이스에 배치하는 것이 좋습니다(예: xxx.PS). 명령을.

입력 처리 방법 재정의

System.Management.Automation.Cmdlet 클래스는 cmdlet이 재정의해야 하는 세 가지 기본 입력 처리 방법을 제공합니다. Windows PowerShell에서 레코드를 처리하는 방법에 대한 자세한 내용은 Windows PowerShell 작동 방식참조하세요.

모든 유형의 입력에 대해 Windows PowerShell 런타임은 system.Management.Automation.Cmdlet.BeginProcessing 호출하여 처리를 사용하도록 설정합니다. cmdlet이 일부 전처리 또는 설정을 수행해야 하는 경우 이 메서드를 재정의하여 이 작업을 수행할 수 있습니다.

비고

Windows PowerShell은 "record"라는 용어를 사용하여 cmdlet이 호출될 때 제공되는 매개 변수 값 집합을 설명합니다.

cmdlet이 파이프라인 입력을 수락하는 경우 system.Management.Automation.Cmdlet.ProcessRecord 메서드와 선택적으로 System.Management.Automation.Cmdlet.EndProcessing 메서드를 재정의해야 합니다. 예를 들어 cmdlet은 System.Management.Automation.Cmdlet.ProcessRecord 사용하여 모든 입력을 수집한 다음 Sort-Object cmdlet처럼 한 번에 하나의 요소가 아닌 전체 입력에서 작동하는 경우 두 메서드를 모두 재정의할 수 있습니다.

cmdlet이 파이프라인 입력을 사용하지 않는 경우 system.Management.Automation.Cmdlet.EndProcessing 메서드를 재정의해야 합니다. 정렬 cmdlet의 경우처럼 이 메서드는 System.Management.Automation.Cmdlet.BeginProcessing 대신 자주 사용됩니다.

이 샘플 Get-Proc cmdlet은 파이프라인 입력을 수신해야 하므로 system.Management.Automation.Cmdlet.ProcessRecord 메서드를 재정의하고 system.Management.Automation.Cmdlet.BeginProcessingSystem.Management.Automation.Cmdlet.EndProcessing대한 기본 구현을 사용합니다. System.Management.Automation.Cmdlet.ProcessRecord 재정의는 프로세스를 검색하고 System.Management.Automation.Cmdlet.WriteObject 메서드를 사용하여 명령줄에 씁니다.

protected override void ProcessRecord()
{
  // Get the current processes
  Process[] processes = Process.GetProcesses();

  // Write the processes to the pipeline making them available
  // to the next cmdlet. The second parameter of this call tells
  // PowerShell to enumerate the array, and send one process at a
  // time to the pipeline.
  WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()

    '/ Get the current processes.
    Dim processes As Process()
    processes = Process.GetProcesses()

    '/ Write the processes to the pipeline making them available
    '/ to the next cmdlet. The second parameter of this call tells
    '/ PowerShell to enumerate the array, and send one process at a
    '/ time to the pipeline.
    WriteObject(processes, True)

End Sub 'ProcessRecord

입력 처리에 대해 기억해야 할 사항

  • 입력의 기본 소스는 명령줄에서 사용자가 제공하는 명시적 개체(예: 문자열)입니다. 자세한 내용은 명령줄 입력 처리하는 cmdlet 만들기참조하세요.

  • 입력 처리 메서드는 파이프라인에 있는 업스트림 cmdlet의 출력 개체에서 입력을 받을 수도 있습니다. 자세한 내용은 파이프라인 입력처리하는 Cmdlet 만들기를 참조하세요. cmdlet은 명령줄 및 파이프라인 원본의 조합에서 입력을 받을 수 있습니다.

  • 다운스트림 cmdlet은 오랫동안 반환되지 않거나 전혀 반환되지 않을 수 있습니다. 따라서 cmdlet의 입력 처리 메서드는 System.Management.Automation.Cmdlet.WriteObject호출하는 동안 잠금을 유지해서는 안 됩니다. 특히 범위가 cmdlet 인스턴스를 넘어 확장하는 잠금입니다.

중요합니다

Cmdlet은 System.Console.Writeline* 또는 그에 상응하는 호출해서는 안 됩니다.

예를 들어 cmdlet이 중간에 취소되거나 cmdlet의 일부에서 종료 오류가 발생하는 경우 System.Management.Automation.Cmdlet.EndProcessing 호출되지 않을 수 있습니다. 따라서 개체 정리가 필요한 cmdlet은 종료자를 포함하여 전체 System.IDisposable 패턴을 구현해야 하므로 런타임은 처리가 끝날 때 system.Management.Automation.Cmdlet.EndProcessing System.IDisposable.Dispose* 모두 호출할 수 있습니다.

코드 샘플

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

개체 형식 및 서식 정의

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

Cmdlet 빌드

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

Cmdlet 테스트

cmdlet이 Windows PowerShell에 등록되면 명령줄에서 실행하여 테스트할 수 있습니다. 샘플 Get-Proc cmdlet에 대한 코드는 작지만 여전히 Windows PowerShell 런타임 및 기존 .NET 개체를 사용하므로 유용하게 사용할 수 있습니다. Get-Proc 수행할 수 있는 일과 출력을 사용하는 방법을 더 잘 이해하기 위해 테스트해 보겠습니다. 명령줄에서 cmdlet을 사용하는 방법에 대한 자세한 내용은 Windows PowerShell 시작하는참조하세요.

  1. Windows PowerShell을 시작하고 컴퓨터에서 실행 중인 현재 프로세스를 가져옵니다.

    Get-Proc
    

    다음 출력이 나타납니다.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    254      7       7664   12048  66     173.75  1200  QCTRAY
    32       2       1372   2628   31       0.04  1860  DLG
    271      6       1216   3688   33       0.03  3816  lg
    27       2       560    1920   24       0.01  1768  TpScrex
    ...
    
  2. 보다 쉽게 조작할 수 있도록 cmdlet 결과에 변수를 할당합니다.

    $p=Get-Proc
    
  3. 프로세스 수를 가져옵니다.

    $p.Length
    

    다음 출력이 나타납니다.

    63
    
  4. 특정 프로세스를 검색합니다.

    $p[6]
    

    다음 출력이 나타납니다.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id    ProcessName
    -------  ------  -----  -----  -----  ------  --    -----------
    1033     3       2400   3336   35     0.53    1588  rundll32
    
  5. 이 프로세스의 시작 시간을 가져옵니다.

    $p[6].StartTime
    

    다음 출력이 나타납니다.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].StartTime.DayOfYear
    
    207
    
  6. 핸들 수가 500보다 큰 프로세스를 가져오고 결과를 정렬합니다.

    $p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
    

    다음 출력이 나타납니다.

    Handles  NPM(K)  PM(K)  WS(K)  VS(M)  CPU(s)  Id   ProcessName
    -------  ------  -----  -----  -----  ------  --   ----------
    568      14      2164   4972   39     5.55    824  svchost
    716       7      2080   5332   28    25.38    468  csrss
    761      21      33060  56608  440  393.56    3300 WINWORD
    791      71      7412   4540   59     3.31    492  winlogon
    ...
    
  7. Get-Member cmdlet을 사용하여 각 프로세스에 사용할 수 있는 속성을 나열합니다.

    $p | Get-Member -MemberType Property
    
        TypeName: System.Diagnostics.Process
    

    다음 출력이 나타납니다.

    Name                     MemberType Definition
    ----                     ---------- ----------
    BasePriority             Property   System.Int32 BasePriority {get;}
    Container                Property   System.ComponentModel.IContainer Conta...
    EnableRaisingEvents      Property   System.Boolean EnableRaisingEvents {ge...
    ...
    

또한 참조하십시오

명령줄 입력 처리하는 cmdlet 만들기

파이프라인 입력 처리하는 Cmdlet 만들기

Windows PowerShell Cmdlet 만드는 방법

개체 형식 확장 및 서식

Windows PowerShell 작동 방식

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

windows PowerShell 참조

Cmdlet 샘플