2012-03-01 129 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。 :-) – 2012-03-01 05:31:11

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'用於最終測試。最後的測試仍然只顯示最後一個值而不是整個數組。我編輯了這個問題來澄清。 – 2012-03-01 04:58:58

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 [],這可能不是你想要的。下面的命令將打印的每個項目的類型的陣列中不管參數如何傳遞:

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

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

哈希表數組呢?我已經有一個Process塊,並且數組仍然在流水線上展開。 沒關係,我想通了。在這個例子中,它將是'Test-Function,$ array' – 2016-06-03 18:15:49

相關問題