매개 변수 없이 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.BeginProcessing 및 System.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에 처리가 완료되면 정리할 개체 변수가 있을 수 있습니다(예: System.Management.Automation.Cmdlet.BeginProcessing 메서드에서 파일 핸들을 열고 System.Management.Automation.Cmdlet.ProcessRecord사용할 핸들을 열어 두는 경우). Windows PowerShell 런타임이 항상 개체 정리를 수행해야 하는 System.Management.Automation.Cmdlet.EndProcessing 메서드를 호출하지는 않는다는 점을 기억해야 합니다.
예를 들어 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 시작하는참조하세요.
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 ...
보다 쉽게 조작할 수 있도록 cmdlet 결과에 변수를 할당합니다.
$p=Get-Proc
프로세스 수를 가져옵니다.
$p.Length
다음 출력이 나타납니다.
63
특정 프로세스를 검색합니다.
$p[6]
다음 출력이 나타납니다.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32
이 프로세스의 시작 시간을 가져옵니다.
$p[6].StartTime
다음 출력이 나타납니다.
Tuesday, July 26, 2005 9:34:15 AM
$p[6].StartTime.DayOfYear
207
핸들 수가 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 ...
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 만드는 방법
Cmdlet, 공급자 및 호스트 애플리케이션 등록하는 방법
PowerShell