2012-03-01 6 views
7

PowerShell 파이프 라인을 통해 개체를 함수에 전달하면 string 개체로 변환됩니다. 객체를 매개 변수로 전달하면 해당 객체는 해당 유형을 유지합니다. 설명하기 :기능이있는 파이프 라인을 사용하여 다른 결과 얻기

을 나는 개체의 유형과 값이 표시 다음 PowerShell을 기능이 있습니다

function TestFunction { 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    Echo $InputObject.GetType().Name 
    Echo $InputObject 
} 

내가 기능을 테스트하려면이 스크립트를 실행은 :

[string[]] $Array = "Value 1", "Value 2" 

# Result outside of function. 
Echo $Array.GetType().Name 
Echo $Array 
Echo "" 

# Calling function with parameter. 
TestFunction $Array 
Echo "" 

# Calling function with pipeline. 
$Array | TestFunction 

이 출력을 생성합니다

String[] 
Value 1 
Value 2 

String[] 
Value 1 
Value 2 

String 
Value 2 

편집 : 파이프 라인을 사용하여 전체 배열을 재미있게 전달하려면 어떻게해야합니까? ction?

답변

7

:

function Test-Function { 
    param (
     [Parameter(ValueFromPipeline=$true)] $Test 
    ) 

    process { 
     $Test.GetType().FullName 
     $Test 
    } 
} 

[string[]] $Array = "Value 1", "Value 2" 
$Array | Test-Function 

더 많은 정보 :

+0

아름다운! 그게 효과가 있어요. 감사! 그리고 다음에 RTFM을하겠습니다. :-) –

0

문자열이 아닌 것을 함수로 전달하려고 시도 했습니까?

사용 해보세요 : 이 1, 2 | TestFunction

편집 :

이보십시오. 내가 만든 유일한 변화는 $ InputObject 주위에 과정 블록을 추가했다 당신이 함수에서 처리 블록을 필요로하는 파이프 라인을 통해 받았다 여러 항목을 처리 할 수 ​​

function TestFunction { 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    process 
    { 
    Echo $InputObject.GetType().Name 
    Echo $InputObject 
    } 
} 
+0

첫 번째 두 개의 테스트에서는 'Int32 []'로 표시되고 마지막 테스트에서는 'Int32'로 표시됩니다. 마지막 테스트는 여전히 전체 배열 대신 마지막 값만 표시합니다. 내가 분명히 할 질문을 편집했습니다. –

3

프로세스 블록 외에도 배열의 각 항목을 처리해야합니다. 배열이 인수가 아닌 파이프를 통하지 않고 전달 될 때 필요합니다. 이것을 고려해보십시오 :

function Test-Function 
{ 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    process 
    { 
     $InputObject.GetType().Name 
    } 
} 

$Array = "Value 1","Value 2" 
Test-Function $array 

결과는 String []입니다. 결과는 아마도 원하는 것이 아닙니다. 다음 명령은 인수가 전달 된 것과 관계없이 배열의 각 항목 유형을 인쇄합니다.

+0

해시 테이블의 배열은 어떻습니까? 이미 Process 블록이 있으며 배열은 여전히 ​​파이프 라인에서 전개됩니다. 신경 쓰지 마, 알아 냈다. 이 예제에서는'Test-Function, $ array' –

관련 문제