2012-03-01 12 views
7

Zauważam, że przekazywanie obiektów do funkcji za pośrednictwem potoku PowerShell konwertuje je do obiektów string. Jeśli przekazuję obiekt jako parametr, zachowuje on jego typ. Aby wykazać, że:Uzyskiwanie różnych wyników przy użyciu potoku z funkcjami

Mam następujący funkcja PowerShell, który wyświetla rodzaj i wartość danego obiektu:

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

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

wpadłem ten skrypt, aby przetestować funkcję:

[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 

To daje wyjście:

String[] 
Value 1 
Value 2 

String[] 
Value 1 
Value 2 

String 
Value 2 

EDYCJA: Jak korzystać z potoku, aby przekazać całą tablicę do zabawy ction?

Odpowiedz

7

Aby przetwarzać kilka pozycji otrzymaliśmy rurociągiem trzeba blok procesu w swojej funkcji:

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

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

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

Więcej informacji:

+0

Piękny! To działa. Dzięki! Następnym razem będę RTFM. :-) –

0

Czy próbowałeś przekazać coś, co nie jest ciągiem znaków do tej funkcji?

Wypróbuj: 1, 2 | TestFunction

EDIT:

Spróbuj tego. Jedyną zmianą zrobiłem było dodać proces blok około $ InputObject

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

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

To pokazuje jako 'Int32 []' dla pierwszych dwóch testów, oraz 'Int32' dla testu końcowego. Ostateczny test nadal wyświetla tylko ostatnią wartość zamiast całej tablicy. Zmieniłem to pytanie, by wyjaśnić. –

3

Oprócz posiadania bloku procesowego należy również przetworzyć każdy element w tablicy. Jest potrzebny, gdy tablica jest przekazywana jako argument, a nie przez rurociągi. Rozważmy to:

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

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

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

Wynikiem będzie String [], który prawdopodobnie nie jest tym, czego potrzebujesz. Poniższe polecenie wypisze typ każdego elementu w tablicy bez względu na sposób przekazania argumentu:

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

    process 
    { 
     foreach($i in $InputObject) 
     { 
      $i.GetType().Name 
     } 
    } 
} 
+0

A co z tablicą haseł? Mam już blok procesu, a tablica jest wciąż rozwijana w potoku. Nieważne, rozgryzłem to. W tym przykładzie będzie to 'Test-Function, $ array' –

Powiązane problemy