항목
about_pipelines
간단한 설명
Windows PowerShell에서 명령을 파이프라인으로 결합
자세한 설명
파이프라인은 파이프라인 연산자(|)(ASCII 124)로 연결된 일련의 명령입니다. 각 파이프라인 연산자는 이전 명령의
결과를 다음 명령에 보냅니다.
파이프라인을 사용하면 한 명령을 통해 출력되어 입력으로 사용할 개체를 다른 명령으로 보내 처리할 수 있습니다.
또한 이 명령의 출력을 또 다른 명령에 보낼 수 있습니다. 따라서 일련의 간단한 명령으로 구성된 강력한 명령 체인
또는 "파이프라인"이 됩니다.
예를 들면 다음과 같습니다.
Command-1 | Command-2 | Command-3
이 예에서 Command-1이 보내는 개체는 Command-2로 보내집니다. Command-2는 개체를 처리하여
Command-3에 보냅니다. Command-3은 개체를 처리하여 파이프라인으로 보냅니다. 파이프라인에 다른 명령이
없으므로 콘솔에 결과가 표시됩니다.
파이프라인에서 명령은 표시된 순서에 따라 왼쪽에서 오른쪽으로 처리됩니다. 처리는 하나의 단일 작업으로 취급되고
출력은 생성될 때 표시됩니다.
간단한 예를 들면 다음과 같습니다. 다음 명령은 Notepad 프로세스를 가져온 다음 중지합니다.
get-process notepad | stop-process
첫 번째 명령은 Get-Process cmdlet을 사용하여 메모장 프로세스를 나타내는 개체를 가져오며 파이프라인
연산자(|)를 사용하여 프로세스 개체를 Stop-Process cmdlet으로 보냅니다. 그러면 이 cmdlet이 메모장
프로세스를 중지합니다. 지정된 프로세스는 파이프라인을 통해 전송되므로 Stop-Process 명령에는 프로세스를
지정할 Name 또는 ID 매개 변수가 없습니다.
실제 예를 들면 다음과 같습니다. 이 명령 파이프라인은 현재 디렉터리에서 텍스트 파일을 가져와서, 길이가
10,000바이트 이상인 파일만 선택하고, 길이별로 정렬한 다음 테이블에 각 파일의 이름과 길이를 표시합니다.
Get-ChildItem -path *.txt | Where-Object {$_.length -gt 10000} |
Sort-Object -property Length | Format-Table -property name, length
이 파이프라인은 지정된 순서의 네 개 명령으로 구성됩니다. 이 명령은 가로로 작성되지만 다음 그림에서는
프로세스를 세로로 표시합니다.
Get-ChildItem -path *.txt
|
| (FileInfo objects )
| ( .txt )
|
V
Where-Object {$_.length -gt 10000}
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
|
V
Sort-Object -property Length
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
| ( Sorted by length )
|
V
Format-Table -property name, length
|
| (FileInfo objects )
| ( .txt )
| ( Length > 10000 )
| ( Sorted by length )
| (Formatted in a table )
|
V
Name Length
---- ------
tmp1.txt 82920
tmp2.txt 114000
tmp3.txt 114000
파이프라인 사용
Windows PowerShell cmdlet은 파이프라인에서 사용하도록 만들어진 것입니다. 예를 들면 Get
cmdlet 결과를 같은 명사의 동작 cmdlet(예: Set, Start, Stop 또는 Rename
cmdlet)에 파이프할 수 있습니다.
예를 들어 Get-Service cmdlet에서 Start-Service 또는 Stop-Service cmdlet으로 서비스를 파이프할
수 있습니다. 단 사용하지 않도록 설정된 서비스를 이 방법을 사용하여 다시 시작할 수는 없습니다
이 명령 파이프라인은 컴퓨터에서 WMI 서비스를 시작합니다.
get-service wmi | start-service
Item 및 ItemProperty cmdlet처럼 Windows PowerShell 공급자 개체를 가져오고 설정하는
cmdlet도 파이프라인에서 사용하도록 만들어진 것입니다.
예를 들면 Windows PowerShell 레지스트리 공급자에서 Get-Item 또는 Get-ChildItem 명령
결과를 New-ItemProperty cmdlet에 파이프할 수 있습니다. 이 명령은 MyCompany 레지스트리
키에 값이 8124인 새 레지스트리 항목 NoOfEmployees를 추가합니다.
get-item -path HKLM:\Software\MyCompany | new-Itemproperty -name NoOfEmployees -value 8124
Get-Member, Where-Object, Sort-Object, Group-Object 및 Measure-Object와 같은 대부분의 유틸리티
cmdlet은 파이프라인에 거의 단독으로 사용됩니다. 이러한 cmdlet에는 아무 개체나 파이프할 수 있습니다.
예를 들어 컴퓨터의 모든 프로세스를 Sort-Object 명령으로 파이프하고 프로세스에서 핸들 수별로 정렬하도록
할 수 있습니다.
get-process | sort-object -property handles
또한 Format-List 및 Format-Table 같은 형식 지정 cmdlet을 Export-Clixml 및
Export-CSV 같은 Export cmdlet과 Out-Printer 같은 Out cmdlet으로 파이프할 수 있습니다.
예를 들면 Winlogon 프로세스를 Format-List cmdlet으로 파이프하여 프로세스의 모든 속성을 목록에 표시할 수
있습니다.
get-process winlogon | format-list -property *
간단한 명령을 파이프라인에 결합하면 시간과 입력을 줄일 수 있고 스크립팅이 훨씬 효율적입니다.
파이프라인 작동 방식
개체를 "파이프"하여 한 명령의 출력에 있는 개체를 다른 명령으로 보내면 Windows Powershell은 파이프된 개체를
수신되는 cmdlet 매개 변수 중 하나와 연결하려고 시도합니다.
이렇게 하기 위해 입력 개체와 cmdlet 매개 변수를 연결하는 Windows Powershell "매개 변수
바인딩" 구성 요소는 다음 조건을 만족하는 매개 변수를 찾으려고 시도합니다.
-- 매개 변수가 파이프라인으로부터의 입력을 허용해야 합니다(모두 그래야 하는 것은 아님)
-- 매개 변수가 보내는 개체의 유형 및 개체를 변환할 수 있는 유형을 허용해야 합니다.
-- 매개 변수가 명령에 이미 사용되지 않았어야 합니다.
예를 들어 Start-Service cmdlet에는 여러 개의 매개 변수가 있지만 이 중 Name 및
InputObject만 파이프라인 입력을 허용합니다. Name 매개 변수는 문자열을 가져오고 InputObject
매개 변수는 서비스 개체를 가져옵니다. 따라서 문자열과 서비스 개체(및 문자열과 서비스 개체로 변환할 수 있는
속성이 있는 개체)를 Start-Service로 파이프할 수 있습니다
Windows PowerShell의 매개 변수 바인딩 구성 요소가 파이프된 개체와 수신 cmdlet의 매개 변수를
연결할 수 없는 경우에는 명령이 실패하고 Windows PowerShell은 누락된 매개 변수 값을 묻는 메시지를
표시합니다.
매개 변수 바인딩 구성 요소를 강제로 지정하여 파이프된 개체와 특정 매개 변수를 연결할 수 없으며 매개
변수도 제안할 수 없습니다. 대신 구성 요소의 논리에서 파이프를 최대한 효율적으로 관리합니다.
한 번에 하나씩 처리
개체를 명령에 파이프하는 것은 명령의 매개 변수를 사용하여 개체를 전송하는 것과 비슷합니다.
예를 들면 다음과 같이 컴퓨터에서 서비스를 나타내는 개체를 Format-Table 명령에 파이프하는 것은
get-service | format-table -property name, dependentservices
변수에 서비스 개체를 저장하고 Format-Table의 InputObject 매개 변수를 사용하여 서비스 개체를
전송하는 것과 같습니다.
$services = get-service
format-table -inputobject $services -property name, dependentservices
또는 명령을 매개 변수 값에 포함하는 것과 같습니다.
format-table -inputobject (get-service wmi) -property name, dependentservices
그러나 중요한 차이점이 있습니다. 여러 개체를 명령으로 파이프하면 개체가 한 번에 하나씩 명령에 보내집니다.
명령 매개 변수를 사용하면 개체가 단일 배열 개체로 보내집니다.
이러한 표면적인 기술 차이로 인해 흥미 있고 때로는 유용한 결과를 얻을 수 있습니다.
예를 들어 여러 프로세스 개체를 Get-Process cmdlet에서 Get-Member cmdlet으로 파이프하면
Windows PowerShell은 각 프로세스 개체를 한 번에 하나씩 Get-Member로 보냅니다.
Get-Member는 프로세스 개체의 .NET 클래스(유형)와 해당 속성 및 메서드를 표시합니다.
Get-Member는 중복을 제거하므로 개체의 유형이 모두 같으면 한 가지 개체 유형만 표시됩니다.
이 경우 Get-Member는 각 프로세스 개체, 즉 System.Diagnostics.Process 개체의 속성과
메서드를 표시합니다.
get-process | get-member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize
...
그러나 Get-Member의 InputObject 매개 변수를 사용하는 경우 Get-Member는
System.Diagnostics.Process 개체의 배열을 단일 단위로 받고 개체 배열 속성을 표시합니다.
배열 기호([])는 System.Object 유형 이름 다음에 옵니다.
get-member -inputobject (get-process)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object& Address(Int32 )
Clone Method System.Object Clone()
...
이 결과는 사용자가 의도한 것이 아닐 수 있지만 이해한 후에 사용할 수 있습니다. 예를 들면 프로세스 개체의 배열에는
컴퓨터에서 프로세스 수를 세는 데 사용할 수 있는 Count 속성이 있습니다.
(get-process).count
이러한 차이는 중요할 수 있으므로 개체를 cmdlet으로 파이프하는 경우 개체가 한 번에 하나씩 전송된다는 것을 기억해
두십시오.
파이프라인 입력 적용 여부
파이프라인의 개체를 받으려면 받는 cmdlet에 파이프라인 입력을 허용하는 매개 변수가 있어야 합니다. Full 또는
Parameter 매개 변수에 Get-Help 명령을 사용하여 cmdlet 매개 변수가 파이프라인 입력을 허용하는지 확인할
수 있습니다.
Get-Help 기본 표시에서 "파이프라인 입력 적용 여부" 항목이 매개 변수 특성 테이블에 표시됩니다. 이 테이블은 Get-
Help cmdlet의 Full 또는 Parameter 매개 변수를 사용하는 경우에만 표시됩니다.
예를 들어 파이프라인 입력을 허용하는 Start-Service cmdlet의 매개 변수를 확인하려면 다음을 입력합니다.
get-help start-service -full
get-help start-service -parameter *
예를 들어 Start-Service cmdlet 도움말은 Name 및 InputObject 매개 변수가 파이프라인
입력을 허용함("true")을 보여 줍니다. 다른 모든 매개 변수는 "파이프라인 입력 적용 여부" 행에 "false"
값이 있습니다.
-name <string[]>
시작할 서비스의 서비스 이름을 지정합니다.
매개 변수 이름은 선택 사항입니다. "-Name" 또는 해당 별칭("-ServiceName")을
사용하거나 매개 변수 이름을 생략할 수 있습니다.
필수 여부 true
위치 1
기본값
--> 파이프라인 입력 적용 여부 true (ByValue, ByPropertyName)
와일드카드 문자 적용 여부 true
-inputObject <ServiceController[]>
시작할 서비스를 나타내는 ServiceController 개체를 지정합니다. 개체가 포함된 변수를
입력하거나 개체를 가져오는 명령 또는 식을 입력하십시오.
필수 여부 false
위치 named
기본값
--> 파이프라인 입력 적용 여부 true (ByValue)
와일드카드 문자 적용 여부 false
즉, 파이프라인을 통해 개체(PsObjects)를 Where-Object cmdlet으로 보내고 Windows
PowerShell에서 개체를 InputObject 매개 변수와 연결할 수 있습니다.
파이프라인 입력 적용 방법
Cmdlet 매개 변수는 두 가지 방법 중 하나로 파이프라인 입력을 허용할 수 있습니다.
-- ByValue: "값을 기준으로" 입력을 받는 매개 변수는 해당 매개 변수 값과 .NET 유형이 같은 파이프된
개체 또는 해당 유형으로 변환할 수 있는 개체를 받을 수 있습니다.
예를 들어 Start-Service의 Name 매개 변수는 값을 기준으로 파이프라인 입력을 받으며 문자열 개체 또는
문자열로 변환할 수 있는 개체를 받을 수 있습니다.
-- ByPropertyName: "속성 이름을 기준으로" 입력을 받는 매개 변수는 개체의 속성에 매개 변수와 같은
이름이 있을 경우에만 파이프된 개체를 받을 수 있습니다.
예를 들어 Start-Service의 Name 매개 변수는 Name 속성을 가진 개체를 받을 수 있습니다.
개체의 속성을 나열하려면 Get-Member에 개체를 파이프합니다.
일부 매개 변수는 값 또는 속성 이름을 기준으로 개체를 받을 수 있습니다. 이러한 매개 변수의 용도는
파이프라인으로부터 손쉽게 입력을 가져오기 위한 것입니다.
파이프라인 오류 조사
파이프라인 오류로 인해 명령이 실패하면 실패를 조사하여 명령을 다시 작성할 수 있습니다.
예를 들어 다음 명령은 Get-Item cmdlet을 사용하여 대상 경로를 얻은 다음 Move-ItemProperty
cmdlet에 이 경로를 파이프하여 한 레지스트리 키에서 다른 레지스트리 키로 레지스트리 항목을 이동합니다.
특히 이 명령은 Get-Item cmdlet을 사용하여 대상 경로를 가져옵니다. 파이프라인 연산자를 사용하여 결과를 Move-
ItemProperty cmdlet에 보냅니다. Move-ItemProperty 명령은 이동할 레지스트리 항목의 현재 경로와 이름을
지정합니다.
get-item -path hklm:\software\mycompany\sales |
move-itemproperty -path hklm:\software\mycompany\design -name product
명령이 실패하고 다음과 같은 오류 메시지가 나타납니다.
Move-ItemProperty : 명령에서 파이프라인 입력을 사용하지 않거나 입력 및 해당 속성이 파이프라인 입력을
사용하는 매개 변수 중 하나와 일치하지 않으므로 입력 개체를 명령에 대한 매개 변수에 바인딩할 수 없습니다.
줄:1 문자:23
+ $a | move-itemproperty <<<< -path hklm:\software\mycompany\design -name product
오류를 조사하려면 Trace-Command cmdlet을 사용하여 Windows PowerShell의 매개 변수
바인딩 구성 요소를 추적합니다. 다음 명령은 명령이 처리되는 동안 매개 변수 바인딩 구성 요소를 추적합니다. 이
명령은 -pshost 매개 변수를 사용하여 콘솔에 결과를 표시하고 이후에 참조할 수 있게 -filepath 명령을 사용하여 결과를
debug.txt 파일에 보냅니다.
trace-command -name parameterbinding -expression {get-item -path hklm:\software\mycompany\sales |
move-itemproperty -path hklm:\software\mycompany\design -name product} -pshost -filepath debug.txt
추적 결과가 길지만 Get-Item cmdlet에 바인딩되는 값과 Move-ItemProperty cmdlet에
바인딩되는 명명된 값이 표시됩니다.
...
BIND NAMED cmd line args [Move-ItemProperty]
BIND arg [hklm:\software\mycompany\design] to parameter [Path]
...
BIND arg [product] to parameter [Name]
....
BIND POSITIONAL cmd line args [Move-ItemProperty]
...
마지막으로 Move-ItemProperty의 Destination 매개 변수에 대한 경로를 바인딩하려는 시도가 실패했음을 보여
줍니다.
...
BIND PIPELINE object to parameters: [Move-ItemProperty]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values
Parameter [Destination] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
...
오류를 조사하려면 Get-Help cmdlet을 사용하여 Destination 매개 변수의 속성을 봅니다. 다음
명령은 Destination 매개 변수에 대한 세부 정보를 가져옵니다.
get-help move-itemproperty -parameter destination
결과는 Destination이 "속성 이름을 기준"으로만 파이프라인 입력을 가져옴을 나타냅니다.
즉, 파이프된 개체에 Destination이라는 속성이 있어야 합니다.
-destination <string>
대상 위치의 경로를 지정합니다.
필수 여부 true
위치 2
기본값
파이프라인 입력 적용 여부 true (ByPropertyName)
와일드카드 문자 적용 여부 true
Move-ItemProperty cmdlet에 파이프되는 개체의 속성을 보려면 Get-Member cmdlet에
파이프합니다. 다음 명령은 명령의 첫 번째 부분의 결과를 Get-Member cmdlet에 파이프합니다.
get-item -path hklm:\software\mycompany\sales | get-member
항목이 Destination 속성이 없는 Microsoft.Win32.RegistryKey라고 출력됩니다. 이것이
명령이 실패한 이유입니다.
명령을 수정하려면 Move-ItemProperty cmdlet에 대상을 지정해야 합니다. Get-ItemPropert
y 명령을 사용하여 경로를 가져올 수 있지만 이름과 대상을 명령의 Move-ItemProperty 부분에 지정해야 합니다.
get-item -path hklm:\software\mycompany\design |
move-itemproperty -dest hklm:\software\mycompany\design -name product
명령이 적용되었는지 확인하려면 Get-ItemProperty 명령을 사용합니다.
get-itemproperty hklm:\software\mycompany\sales
결과에 제품 레지스트리 항목이 Sales 키로 이동되었음이 표시됩니다.
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\mycompany\sales
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\mycompany
PSChildName : sales
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Product : 18
참고 항목
about_objects
about_parameters
about_command_syntax
about_foreach