2012-03-01 7 views
7

Tôi đang tìm các đối tượng chuyển tiếp tới các hàm thông qua đường ống PowerShell chuyển đổi chúng thành các đối tượng string. Nếu tôi vượt qua đối tượng như một tham số, nó sẽ giữ kiểu của nó. Để chứng minh:Lấy các kết quả khác nhau bằng cách sử dụng đường ống với các hàm

Tôi đã chức năng PowerShell sau đó sẽ hiển thị loại và giá trị của một đối tượng:

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

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

Tôi chạy script này để kiểm tra các chức năng:

[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 

này tạo ra kết quả:

String[] 
Value 1 
Value 2 

String[] 
Value 1 
Value 2 

String 
Value 2 

EDIT: Làm thế nào tôi có thể sử dụng đường ống để truyền toàn bộ mảng đến một niềm vui ction?

Trả lời

7

Để xử lý nhiều mục nhận được qua đường ống bạn cần một khối quá trình trong chức năng của bạn:

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

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

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

Thông tin thêm:

+0

Đẹp! Điều đó khiến nó hoạt động. Cảm ơn! Và lần tới, tôi sẽ RTFM. :-) –

0

Bạn đã thử truyền một thứ không phải là chuỗi vào hàm đó?

Thử: 1, 2 | TestFunction

EDIT:

Hãy thử điều này. Sự thay đổi duy nhất tôi làm là để thêm một quá trình khối khoảng $ InputObject

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

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

Hiển thị là 'Int32 []' cho hai phép thử đầu tiên và 'Int32' cho phép thử cuối cùng. Bài kiểm tra cuối cùng vẫn chỉ hiển thị giá trị cuối cùng thay vì toàn bộ mảng. Tôi đã chỉnh sửa câu hỏi để làm rõ. –

3

Ngoài việc có một khối xử lý, bạn cũng cần xử lý từng mục trong mảng. Nó là cần thiết khi mảng được truyền như một đối số, không phải thông qua đường ống. Hãy xem xét điều này:

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

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

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

Kết quả sẽ là Chuỗi [], có thể không phải là những gì bạn muốn. Lệnh sau sẽ in loại của mỗi mục trong mảng bất kể tham số được truyền như thế nào:

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

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

Điều gì về một loạt các hashtables? Tôi đã có một khối Process và mảng vẫn chưa được kiểm soát trên đường ống. Không bao giờ, tôi đã tìm ra. Trong ví dụ này, nó sẽ là 'Test-Function, $ array' –