2015-06-03 5 views
10

कहा जाता है जो मैं करने की कोशिश कर रहा हूं, समय सीमा तक पहुंचने पर पाइपलाइन फ़ीड को रोकने के लिए एक फ़ंक्शन प्राप्त करें। मैं एक परीक्षण समारोह बना लिया है इस प्रकार है:पावरशेल पाइपलाइन को रोकना, सुनिश्चित करें कि अंत को

function Test-PipelineStuff 
{ 
    [cmdletbinding()] 
    Param(
     [Parameter(ValueFromPipeLIne=$true)][int]$Foo, 
     [Parameter(ValueFromPipeLIne=$true)][int]$MaxMins 
    ) 

    begin { 
     "THE START" 
     $StartTime = Get-Date 
     $StopTime = (get-date).AddMinutes($MaxMins) 
     "Stop time is: $StopTime" 
    } 

    process 
    { 
     $currTime = Get-Date 
     if($currTime -lt $StopTime){ 
      "Processing $Foo"    
     } 
     else{ 
      continue; 
     } 
    } 

    end { "THE END" } 
} 

यह निश्चित रूप पाइप लाइन बंद हो जाएगा, लेकिन यह कभी नहीं मेरी कॉल "अंत {}" ब्लॉक है, जो इस मामले में महत्वपूर्ण है। क्या किसी को पता है कि "जारी रखें" का उपयोग करके पाइपलाइन को बंद करते समय मेरा "अंत {}" ब्लॉक क्यों नहीं कहा जा रहा है? यदि मैं एक पाइपलाइनस्टॉप अपवाद फेंकता हूं तो व्यवहार समान होता है।

+1

संभवतः 'जारी रखें' अपने युक्त लूप से बाहर निकल रहा है, केवल कोई भी नहीं है जिससे यह आपके पूरे कार्य को स्पष्ट कर सके। हालांकि यह बिल्कुल उपयोगी नहीं है। मुझे यकीन नहीं है कि क्या करने का एक उचित तरीका है जो आप यहां करने की कोशिश कर रहे हैं। –

+1

जैसा कि मैं इसे समझता हूं, cmdlets जैसे कि Select-Object -First 1 पाइपलाइन को रोकने के लिए StopUpstreamCommandsException को बढ़ाएगा, जो एक आंतरिक अपवाद है और मेरे अपने उपयोग के लिए दृश्यमान नहीं है। :( –

+0

हो सकता है कि आप अपना 'अंत {}' प्रसंस्करण एक अलग स्क्रिप्टब्लॉक में डाल दें जिसे आप 'else {} 'क्लॉज इन' प्रक्रिया {}'? –

उत्तर

2

about_Functions के अनुसार:

के बाद समारोह पाइप लाइन में सभी वस्तुओं को प्राप्त करता है, अंत बयान सूची एक बार चलाता है। यदि कोई प्रारंभ, प्रक्रिया, या अंतिम कीवर्ड उपयोग नहीं किया जाता है, तो सभी कथनों को एंड कथन सूची की तरह माना जाता है।

इस प्रकार आपको केवल else ब्लॉक को छोड़ने की आवश्यकता है। फिर पाइपलाइन में सभी ऑब्जेक्ट्स संसाधित होते हैं, लेकिन if खंड के कारण वास्तविक प्रसंस्करण केवल तब तक किया जा रहा है जब तक कि समय सीमा न हो।

+1

यदि मुझे पाइपलाइन में सभी ऑब्जेक्ट्स को संसाधित करने के लिए इसका इंतजार करना है, तो यह निश्चित समय पर रोकने के लिए इसे बताने की कोशिश करने के लाभ को बहुत अधिक अस्वीकार करता है। मैं इस स्क्रिप्ट को रोकने के लिए कोशिश कर रहा हूं अगर यह समय सीमा को हिट करता है, और उस सीमा के बाहर सभी वस्तुओं को संसाधित करने से बचता है। निस्संदेह मैं निष्पादित करने के लिए अंत ब्लॉक प्राप्त कर सकता हूं अगर मैं सबकुछ संसाधित करता हूं, लेकिन यह मेरा लक्ष्य नहीं है। –

+0

सवाल यह था कि अंत ब्लॉक क्यों नहीं बुलाया जाता है। जवाब यह है कि पाइपलाइन में सभी वस्तुओं को संसाधित होने पर ही इसे बुलाया जाता है। –

+1

नहीं, सवाल यह था कि मैं पाइपलाइन को कैसे रोकूं और सुनिश्चित करता हूं कि अंत कहलाता है। –

0

break/continue का उपयोग करके या अपवाद फेंकने से आपका कार्य समय-समय पर आपके कार्य से बाहर निकल जाएगा (और किसी भी संलग्न लूप को भी जारी/जारी रखेगा)।

हालांकि, आप begin ब्लॉक में एक सफाई समारोह एम्बेड कर सकते हैं लागू करता है कि क्या आप मूल रूप से अपने end ब्लॉक में डाल दिया और से कि फ़ंक्शन को कॉल दोनों अपने process ब्लॉक - बस से पहले continue - औरend ब्लॉक:

function Test-PipelineStuff 
{ 
    [cmdletbinding()] 
    Param(
     [Parameter(ValueFromPipeLine=$true)][int]$Foo, 
     [Parameter(ValueFromPipeLine=$true)][int]$MaxMins 
    ) 

    begin { 
     "THE START" 
     $StartTime = Get-Date 
     $StopTime = (get-date).AddMinutes($MaxMins) 
     "Stop time is: $StopTime" 

     # Embedded cleanup function. 
     function clean-up { 
      "THE END" 
     } 

    } 

    process 
    { 
     $currTime = Get-Date 
     if($currTime -lt $StopTime){ 
      "Processing $Foo"    
     } 
     else { 
      # Call the cleanup function just before stopping the pipeline. 
      clean-up 
      continue; 
     } 
    } 

    end { 
     # Normal termination: call the cleanup function. 
     clean-up 
    } 
} 
संबंधित मुद्दे