सवाल PowerShell में ForEach-Object से कैसे बाहर निकलें


मेरे पास निम्न कोड है:

$project.PropertyGroup | Foreach {
    if($_.GetAttribute('Condition').Trim() -eq $propertyGroupConditionName.Trim()) {
        $a = $project.RemoveChild($_);
        Write-Host $_.GetAttribute('Condition')"has been removed.";
    }
};

प्रश्न # 1: मैं फॉरएच से कैसे बाहर निकल सकता हूं? मैंने "ब्रेक" और "जारी रखें" का उपयोग करने की कोशिश की, लेकिन यह काम नहीं करता है।

प्रश्न # 2: मैंने पाया कि मैं सूची में एक को बदल सकता हूं foreach लूप ... हम इसे सी # में ऐसा नहीं कर सकते ... PowerShell हमें ऐसा करने की अनुमति क्यों देता है?


43
2018-04-23 09:32


मूल




जवाब:


वस्तु 1। एक रखो break के अंदर foreach पाश लूप से बाहर निकलता है, लेकिन यह पाइपलाइन को नहीं रोकता है। ऐसा लगता है जैसे आप ऐसा कुछ चाहते हैं:

$todo=$project.PropertyGroup 
foreach ($thing in $todo){
    if ($thing -eq 'some_condition'){
        break
    }
}

आइटम # 2। PowerShell आपको एक सरणी को संशोधित करने देता है foreach उस सरणी पर लूप, लेकिन जब तक आप लूप से बाहर नहीं जाते हैं तब तक वे परिवर्तन प्रभावी नहीं होते हैं। उदाहरण के लिए नीचे दिए गए कोड को चलाने का प्रयास करें।

$a=1,2,3
foreach ($value in $a){
  Write-Host $value
}
Write-Host $a

मैं इस बात पर टिप्पणी नहीं कर सकता कि PowerShell के लेखकों ने इसे क्यों अनुमति दी, लेकिन अधिकांश अन्य स्क्रिप्टिंग भाषाओं (पर्ल, अजगर और खोल) समान संरचनाओं की अनुमति देते हैं।


76
2018-05-02 19:40



मुझे लगता है कि आप एक लाइन जोड़ने के लिए मतलब था, $a = 1..23; अपने लूप में यह दिखाने के लिए कि परिवर्तन मिड-लूप निष्पादन परिलक्षित नहीं होते हैं। - ruffin
आइटम # 2 गलत है (कम से कम v5 के साथ एक निश्चित आकार के सरणी के साथ)। आप सरणी को संशोधित कर सकते हैं और इसे भीतर देख सकते हैं ForEach निर्माण। अगर आप जोड़ना चाहते थे $a[1] = 9 के अंदर ForEach निर्माण, यह 9 तत्व को 2 तत्व के रूप में दिखाएगा, लेकिन आप सरणी से तत्वों को जोड़ / हटा नहीं सकते हैं, और जो कुछ भी आप जोड़ते हैं उसे जोड़ सकते हैं += ऑपरेटर अंत तक नहीं दिखाया जाएगा। यदि एक निश्चित आकार की सरणी नहीं है (यानी। $a=[System.Collections.ArrayList]@(1,2,3)) तो सामग्री को संशोधित करने का कोई भी प्रयास होगा Collection was modified; enumeration operation may not execute. लूप को समाप्त करने में त्रुटि। - Adrian
यह एक पूरी तरह गलत जवाब है। सवाल के संबंध में है Foreach-Object। शक्तिशक्ति में (मुख्य रूप से कष्टप्रद गोचा बीटीडब्ल्यू) foreach एक "ऑपरेटर" और "उपनाम" है। foreach smeltplate द्वारा इस जवाब में प्रदान किया गया "ऑपरेटर" है और "उपनाम" नहीं है। देख यहाँ।  नोट: यह उत्तर कोड का एक संपूर्ण रिफैक्टरिंग है और कई स्थितियों के लिए काम नहीं कर सकता है। - Jamie Marshall
@ जैमी मार्शल हाँ, आप बिल्कुल सही हैं। फॉरएच-ऑब्जेक्ट लूप में ब्रेक मेरे टेस्ट मामलों में पूरी स्क्रिप्ट समाप्त करता है - Tom
यह मेरे लिए काम नहीं करता है - मुझे ब्रेक अपवाद मिलता है Get-ADGroupMember - PeterX


जिसकी पाइपलाइन को रोकने के लिए ForEach-Object भाग सिर्फ कथन का उपयोग करें continue स्क्रिप्ट ब्लॉक के अंदर ForEach-Objectcontinue जब आप इसका उपयोग करते हैं तो अलग-अलग व्यवहार करते हैं foreach(...) {...} और में ForEach-Object {...} और यही कारण है कि यह संभव है। यदि आप कुछ मूल वस्तुओं को छोड़कर पाइपलाइन में ऑब्जेक्ट्स को उत्पादित करना चाहते हैं, तो इसका उपयोग करने का सबसे अच्छा तरीका है फ़िल्टर करना Where-Object


6
2017-12-24 17:15



+1। दिलचस्प। मैं इसे कभी नहीं जानता था। ऐसा लगता है कि आप इसका इस्तेमाल करते हैं या नहीं break या continue। मुझे आश्चर्य है कि यह सवाल के लेखक के लिए क्यों काम नहीं करता क्योंकि उन्होंने कहा कि उन्होंने दोनों की कोशिश की थी। - BACON
कोई विचार जहां यह दस्तावेज है? about_break तथा about_continue केवल बात करो for, foreach, while, तथा switch बयान। ForEach-Object इसका कोई जिक्र नहीं है break या continue। - BACON
यह मेरे लिए काम नहीं करता है - मुझे एक जारी अपवाद प्राप्त होता है Get-ADGroupMember - PeterX