2012-03-01 15 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

सुंदर! यह काम कर रहा है। धन्यवाद! और अगली बार, मैं आरटीएफएम करूंगा। :-) –

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 

परिणाम स्ट्रिंग [] होगा, जो शायद आप नहीं चाहते हैं। निम्न आदेश सरणी में प्रत्येक आइटम के प्रकार को मुद्रित करेगा चाहे कोई भी तर्क पारित न हो:

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

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

क्या hashtables की एक सरणी के बारे में? मैं पहले से ही एक प्रक्रिया ब्लॉक है और सरणी अभी भी पाइप लाइन पर unrolled है। कभी नहीं, मैंने इसे समझ लिया। इस उदाहरण में यह 'टेस्ट-फ़ंक्शन, $ सरणी' होगा –