cmdlet에 대한 입력 소스 중 하나는 업스트림 cmdlet에서 시작되는 파이프라인의 개체입니다. 이 섹션에서는 cmdlet이 파이프라인 개체를 처리할 수 있도록 Get-Proc cmdlet에 매개 변수를 추가하는 방법을 설명합니다(첫 번째 cmdlet만들기에 설명됨).
이 Get-Proc cmdlet은 파이프라인 개체의 입력을 수락하고 제공된 이름을 기반으로 로컬 컴퓨터에서 프로세스 정보를 검색한 다음 명령줄에서 프로세스에 대한 정보를 표시하는 Name
매개 변수를 사용합니다.
Cmdlet 클래스 정의
cmdlet 만들기의 첫 번째 단계는 항상 cmdlet의 이름을 지정하고 cmdlet을 구현하는 .NET 클래스를 선언하는 것입니다. 이 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에 대한 파이프라인의 입력을 정의하는 방법을 설명합니다. 이 Get-Proc cmdlet은 명령줄 입력처리하는 매개 변수 추가에 설명된 대로 Name
매개 변수를 나타내는 속성을 정의합니다.
(매개 변수 선언에 대한 일반적인 정보는 해당 항목을 참조하세요.)
그러나 cmdlet이 파이프라인 입력을 처리해야 하는 경우 해당 매개 변수가 Windows PowerShell 런타임의 입력 값에 바인딩되어 있어야 합니다. 이렇게 하려면 ValueFromPipeline
키워드를 추가하거나 ValueFromPipelineByProperty
키워드를 System.Management.Automation.ParameterAttribute 특성 선언에 추가해야 합니다. cmdlet이 전체 입력 개체에 액세스하는 경우 ValueFromPipeline
키워드를 지정합니다. cmdlet이 개체의 속성에만 액세스하는 경우 ValueFromPipelineByProperty
지정합니다.
다음은 파이프라인 입력을 허용하는 이 Get-Proc cmdlet의 Name
매개 변수에 대한 매개 변수 선언입니다.
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return this.processNames; }
set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
이전 선언에서는 ValueFromPipeline
키워드를 true
설정하여 개체가 매개 변수와 형식이 같거나 동일한 형식으로 강제 변환될 수 있는 경우 Windows PowerShell 런타임이 들어오는 개체에 매개 변수를 바인딩합니다.
ValueFromPipelineByPropertyName
키워드도 true
설정되므로 Windows PowerShell 런타임에서 들어오는 개체에서 Name
속성을 확인합니다. 들어오는 개체에 이러한 속성이 있는 경우 런타임은 Name
매개 변수를 들어오는 개체의 Name
속성에 바인딩합니다.
비고
매개 변수의 ValueFromPipeline
특성 키워드 설정이 ValueFromPipelineByPropertyName
키워드 설정보다 우선합니다.
입력 처리 방법 재정의
cmdlet이 파이프라인 입력을 처리하는 경우 적절한 입력 처리 방법을 재정의해야 합니다. 기본 입력 처리 방법은 첫 번째 Cmdlet 만들기도입되었습니다.
이 Get-Proc cmdlet은 System.Management.Automation.Cmdlet.ProcessRecord 메서드를 재정의하여 사용자 또는 스크립트에서 제공하는 Name
매개 변수 입력을 처리합니다. 이 메서드는 요청된 각 프로세스 이름 또는 이름이 제공되지 않은 경우 모든 프로세스에 대한 프로세스를 가져옵니다.
System.Management.Automation.Cmdlet.ProcessRecord내에서 WriteObject(System.Object, System.Boolean) 대한 호출은 출력 개체를 파이프라인으로 보내는 출력 메커니즘입니다. 이 호출의 두 번째 매개 변수인 enumerateCollection
true
설정되어 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);
} // End foreach (string name...).
}
}
Protected Overrides Sub ProcessRecord()
Dim processes As Process()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
processes = Process.GetProcesses()
Else
'/ 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 If
End Sub 'ProcessRecord
코드 샘플
전체 C# 샘플 코드는 GetProcessSample03 샘플참조하세요.
개체 형식 및 서식 정의
Windows PowerShell은 .NET 개체를 사용하여 cmdlet 간에 정보를 전달합니다. 따라서 cmdlet은 자체 형식을 정의해야 하거나 cmdlet이 다른 cmdlet에서 제공하는 기존 형식을 확장해야 할 수 있습니다. 새 형식을 정의하거나 기존 형식을 확장하는 방법에 대한 자세한 내용은 개체 형식 확장 및 서식참조하세요.
Cmdlet 빌드
cmdlet을 구현한 후에는 Windows PowerShell 스냅인을 통해 Windows PowerShell에 등록해야 합니다. cmdlet 등록에 대한 자세한 내용은 Cmdlet, 공급자 및 호스트 애플리케이션등록하는 방법을 참조하세요.
Cmdlet 테스트
cmdlet이 Windows PowerShell에 등록되면 명령줄에서 실행하여 테스트합니다. 예를 들어 샘플 cmdlet에 대한 코드를 테스트합니다. 명령줄에서 cmdlet을 사용하는 방법에 대한 자세한 내용은 Windows PowerShell 시작하는참조하세요.
Windows PowerShell 프롬프트에서 다음 명령을 입력하여 파이프라인을 통해 프로세스 이름을 검색합니다.
PS> type ProcessNames | Get-Proc
다음 출력이 나타납니다.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 809 21 40856 4448 147 9.50 2288 iexplore 737 21 26036 16348 144 22.03 3860 iexplore 39 2 1024 388 30 0.08 3396 notepad 3927 62 71836 26984 467 195.19 1848 OUTLOOK
다음 줄을 입력하여 "IEXPLORE"라는 프로세스에서
Name
속성이 있는 프로세스 개체를 가져옵니다. 이 예제에서는Get-Process
cmdlet(Windows PowerShell에서 제공)을 업스트림 명령으로 사용하여 "IEXPLORE" 프로세스를 검색합니다.PS> Get-Process iexplore | Get-Proc
다음 출력이 나타납니다.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore
또한 참조하십시오
명령줄 입력 처리하는 매개 변수 추가
첫 번째 cmdlet 만들기
Cmdlet, 공급자 및 호스트 애플리케이션 등록하는 방법
PowerShell