2017-05-11 14 views
3

특정 텍스트의 필드를 구문 분석하고 사용자 지정 개체를 반환하는이 함수를 만들었습니다.이 함수는 왜 파이프 된 변수와 함께 작동하지 않습니까?

Get-MachineUser -VMArray $PassedArray 구문을 사용하면 모든 것이 잘 작동하지만 배열을 파이프하면 작동하지 않습니다. $PassedArray | Get-MachinesUser.

팀원 중 누군가와 일하면서 배열을 전달할 때 배열의 마지막 항목 만 처리한다는 것을 알았습니다. 나는 다른 문법을 사용하는 것에 신경 쓰지 않지만 파이핑이 작동하지 않는 원인이 무엇인지 궁금하다.

function Get-MachinesUser{ 
    param (
     [parameter(Mandatory=$true, ValueFromPipeline=$true)] 
     [System.Object[]] $VMArray 
    ) 
    foreach($vm in $VMArray){ 
     if($VM.Description -match '.*(ut[A-Za-z0-9]{5}).*'){ 
      [PSCustomObject]@{ 
      "Name" = $vm.Name 
      "User" = $Matches[1] 
      } 
     } 
    } 
} 
+0

어떤 객체 유형이 $ PassedArray입니까, 어떤 객체 유형이 포함되어 있습니까 (문자열, 객체 모음, 기타)? –

+1

문자열 배열입니다. – finalbroadcast

답변

5

파이프 라인 입력을 지원하려면 함수에서 처리 블록이 필요합니다

function Get-MachinesUser{ 
    param (
     [parameter(Mandatory=$true, ValueFromPipeline=$true)] 
     [System.Object[]] $VMArray 
    ) 
    Process{ 
     foreach($vm in $VMArray){ 
      if($VM.Description -match '.*(ut[A-Za-z0-9]{5}).*'){ 
       [PSCustomObject]@{ 
       "Name" = $vm.Name 
       "User" = $Matches[1] 
       } 
      } 
     } 
    } 
} 

프로세스

이 블록은 기록별로 레코드에 대한 처리를 제공하는 데 사용됩니다 기능. 이 블록은 함수의 입력에 따라 여러 번 사용될 수 있습니다 ( ). 예를 들어 함수 이 파이프 라인의 첫 번째 명령 인 경우 Process 블록은 으로 한 번 사용됩니다. 함수가 파이프 라인의 첫 번째 명령이 아니면 파이프 라인에서 함수 이받는 모든 입력에 대해 프로세스 블록이 한 번 사용됩니다.

자료 : https://ss64.com/ps/syntax-function-input.html

(참고 : SS64 잘못에는 파이프 라인 입력이없는 경우, 실제로는 아직 한 번 실행 반면 프로세스 블록이 실행되지 않은 것으로 표시된 바와 견적 약간 개정되었다).

매개 변수를 전달할 때 배열 입력을 지원한다는 의미이므로 ForEach 루프를 포함해도 문제가 없습니다. 그러나 파이프 라인을 통해 전송 될 때 모든 입력을 처리하려면 Process { } 블록이 필요합니다.

+3

이 답변을 보완하기 위해 [Boe Prox의이 주제에 대한 훌륭한 가이드] (https://learn-powershell.net/2013/05/07/tips-on-implementing-pipeline-support/) – BenH

+0

이것은 다음과 같습니다. 이 질문에 답하고 편집 한 후에 작성한 주석마다 객체가 아닌 문자열 배열을 입력하고 있습니다. '[System.Object []] $ VMArray'를''String []] $ VMArray'로 바꾸고 if ($ VM -match'가 정확하다면 if ($ VM.Description -match'')를 –

+0

여기서 뭔가를 간과 할 수도 있지만 프로세스 블록을 추가하면 파이핑에 대한 동작이 변경 될 것입니다. 일반 매개 변수와 동일한 변수를 사용하여 함수를 호출 할 때 Get-MachineUser -VMArray $ PassedArray 제대로 작동합니다. PowerShell의 동작을 간과 한 것일 수도 있지만 배열을 전달하는 것과 매개 변수로 사용하는 것 사이에 차이가 없다고 가정했습니다. – finalbroadcast