항목
    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




목차