खोज…
परिचय
लूप इंस्ट्रक्शन (अनुक्रमों) का एक अनुक्रम होता है जिसे एक निश्चित स्थिति तक पहुंचने तक लगातार दोहराया जाता है। अपने प्रोग्राम को बार-बार निष्पादित करने में सक्षम होने के कारण कोड का एक ब्लॉक प्रोग्रामिंग में सबसे बुनियादी लेकिन उपयोगी कार्यों में से एक है। एक लूप आपको पुनरावृत्ति द्वारा बहुत अधिक परिणाम देने के लिए एक बहुत ही सरल कथन लिखने देता है। यदि स्थिति तक पहुँच गया है, तो अगला निर्देश "से होकर गिरता है" अगले अनुक्रमिक निर्देश या लूप के बाहर शाखाओं पर।
वाक्य - विन्यास
के लिए (<आरंभिकरण>? <स्थिति>; <पुनरावृत्ति>) {<Script_Block>}
<संग्रह> | Foreach-Object {<Script_Block_with _ $ __ as_current_item>}
foreach (<संग्रह> <संग्रह> में) {<Script_Block>}
जबकि (<स्थिति>) {<Script_Block>}
{{Script_Block>} जबकि (<कंडीशन>) करें
{{Script_Block>} तक (<कंडीशन>) करें
<संग्रह> .foreach ({<Script_Block_with _ $ __ as_current_item>})
टिप्पणियों
प्रत्येक के लिए
PowerShell में फ़ॉरच-लूप चलाने के कई तरीके हैं और वे सभी अपने फायदे और नुकसान लाते हैं:
समाधान | लाभ | नुकसान |
---|---|---|
फॉरचेट स्टेटमेंट | सबसे तेजी से। स्थिर संग्रह (एक चर में संग्रहीत) के साथ सबसे अच्छा काम करता है। | कोई पाइपलाइन इनपुट या आउटपुट नहीं |
ForEach () विधि | उसी स्क्रिप्टब्लॉक सिंटैक्स को Foreach-Object , लेकिन तेज़ी से। स्थिर संग्रह (एक चर में संग्रहीत) के साथ सबसे अच्छा काम करता है। पाइपलाइन उत्पादन का समर्थन करता है। | पाइपलाइन इनपुट के लिए कोई समर्थन नहीं। PowerShell 4.0 या अधिक से अधिक की आवश्यकता है |
फ़ॉरच-ऑब्जेक्ट (cmdlet) | पाइपलाइन इनपुट और आउटपुट का समर्थन करता है। आरंभ और कनेक्शन के समापन आदि के लिए स्क्रिप्ट-स्क्रिप्टब्लॉक का समर्थन करता है। सबसे लचीला समाधान। | सबसे धीमा |
प्रदर्शन
$foreach = Measure-Command { foreach ($i in (1..1000000)) { $i * $i } }
$foreachmethod = Measure-Command { (1..1000000).ForEach{ $_ * $_ } }
$foreachobject = Measure-Command { (1..1000000) | ForEach-Object { $_ * $_ } }
"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
जबकि Foreach-Object
सबसे धीमा है, यह पाइपलाइन-सपोर्ट उपयोगी हो सकता है क्योंकि यह आपको आइटमों को प्रोसेस करने की सुविधा देता है क्योंकि वे आते हैं (फ़ाइल पढ़ते हुए, डेटा प्राप्त करना आदि)। बड़े डेटा और कम मेमोरी के साथ काम करते समय यह बहुत उपयोगी हो सकता है क्योंकि प्रसंस्करण से पहले आपको सभी डेटा को मेमोरी में लोड करने की आवश्यकता नहीं होती है।
के लिये
for($i = 0; $i -le 5; $i++){
"$i"
}
लूप के लिए एक विशिष्ट उपयोग एक सरणी में मानों के सबसेट पर काम करना है। ज्यादातर मामलों में, यदि आप किसी सरणी में सभी मानों को पुनरावृत्त करना चाहते हैं, तो फ़ॉरच कथन का उपयोग करने पर विचार करें।
प्रत्येक के लिए
ForEach
PowerShell में दो अलग-अलग अर्थ हैं। एक कीवर्ड है और दूसरा फॉरएच-ऑब्जेक्ट cmdlet के लिए एक उपनाम है। पूर्व यहाँ वर्णित है।
यह उदाहरण कंसोल में सभी आइटमों को कंसोल होस्ट को प्रिंट करने का प्रदर्शन करता है:
$Names = @('Amy', 'Bob', 'Celine', 'David')
ForEach ($Name in $Names)
{
Write-Host "Hi, my name is $Name!"
}
यह उदाहरण दिखाता है कि फॉरेक्स लूप का आउटपुट कैप्चर करना है:
$Numbers = ForEach ($Number in 1..20) {
$Number # Alternatively, Write-Output $Number
}
पिछले उदाहरण की तरह, यह उदाहरण, लूप को संग्रहीत करने से पहले एक सरणी बनाने का प्रदर्शन करता है:
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
जबकि
एक लूप एक स्थिति का मूल्यांकन करेगा और अगर सच एक कार्रवाई करेगा। जब तक स्थिति सही होने के लिए मूल्यांकन करती है, तब तक कार्रवाई जारी रहेगी।
while(condition){
code_block
}
निम्न उदाहरण एक लूप बनाता है जो 10 से 0 तक गिना जाएगा
$i = 10
while($i -ge 0){
$i
$i--
}
Do
-While लूप के विपरीत स्थिति का मूल्यांकन कार्रवाई के पहले निष्पादन से पहले किया जाता है। यदि प्रारंभिक स्थिति झूठी का मूल्यांकन करती है तो कार्रवाई नहीं की जाएगी।
नोट: स्थिति का मूल्यांकन करते समय, PowerShell एक रिटर्न ऑब्जेक्ट के अस्तित्व को सच मान लेगा। यह कई तरीकों से उपयोग किया जा सकता है लेकिन नीचे एक प्रक्रिया के लिए निगरानी करने के लिए एक उदाहरण है। यह उदाहरण एक नोटपैड प्रक्रिया को फैलाएगा और तब तक चालू शेल को सोएगा जब तक कि प्रक्रिया चल रही है। जब आप मैन्युअल रूप से नोटपैड उदाहरण को बंद करते हैं, जबकि स्थिति विफल हो जाएगी और लूप टूट जाएगा।
Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
Start-Sleep -Milliseconds 500
}
Foreach-वस्तु
ForEach-Object
cmdlet के लिए इसी तरह काम करता है foreach
बयान है, लेकिन पाइप लाइन से अपने इनपुट लेता है।
मूल उपयोग
$object | ForEach-Object {
code_block
}
उदाहरण:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
Foreach-Object
में दो डिफ़ॉल्ट उपनाम हैं, foreach
और %
(आशुलिपि वाक्यविन्यास)। सबसे आम %
क्योंकि फॉर्च्यूमेंट स्टेटमेंट के साथ foreach
को भ्रमित किया जा सकता है। उदाहरण:
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
उन्नत उपयोग
Foreach-Object
वैकल्पिक foreach
सॉल्यूशंस से बाहर है क्योंकि यह एक cmdlet है जिसका अर्थ है कि यह पाइपलाइन का उपयोग करने के लिए डिज़ाइन किया गया है। इस वजह से, यह एक cmdlet या उन्नत फ़ंक्शन की तरह तीन स्क्रिप्टब्लॉक का समर्थन करता है:
- आरंभ : पाइपलाइन से आने वाली वस्तुओं के माध्यम से लूपिंग से पहले एक बार निष्पादित। आमतौर पर लूप में उपयोग के लिए फ़ंक्शन बनाने के लिए उपयोग किया जाता है, चर बनाने, कनेक्शन (डेटाबेस, वेब +) आदि खोलना।
- प्रक्रिया : पाइप लाइन से प्रति आइटम एक बार आने के बाद। "सामान्य" फॉरच कोडब्लॉक। पैरामीटर निर्दिष्ट नहीं किए जाने पर ऊपर दिए गए उदाहरणों में इसका उपयोग डिफ़ॉल्ट है।
- अंत : सभी वस्तुओं को संसाधित करने के बाद एक बार निष्पादित किया जाता है। आमतौर पर कनेक्शन बंद करने, एक रिपोर्ट बनाने आदि के लिए उपयोग किया जाता है।
उदाहरण:
"Any","Bob","Celine","David" | ForEach-Object -Begin {
$results = @()
} -Process {
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($results.Count)"
$results
}
कर
जब आप हमेशा कम से कम एक बार कोडब्लॉक चलाना चाहते हैं तो डू-लूप उपयोगी होते हैं। एक डू-लूप कोडब्लॉक को निष्पादित करने के बाद की स्थिति का मूल्यांकन करेगा, जबकि थोड़ी देर के लूप के विपरीत जो कोडब्लॉक को निष्पादित करने से पहले करता है।
आप दो तरीकों से दो-छोरों का उपयोग कर सकते हैं:
लूप जबकि हालत सही है:
Do { code_block } while (condition)
स्थिति के सही होने तक लूप करें, दूसरे शब्दों में, लूप जबकि स्थिति झूठी है:
Do { code_block } until (condition)
वास्तविक उदाहरण:
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
डू-ए-एंड-टू-एनटोनियस लूप हैं। यदि समान के अंदर कोड है, तो स्थिति उलट हो जाएगी। ऊपर दिया गया उदाहरण इस व्यवहार को दर्शाता है।
ForEach () विधि
ForEach-Object
cmdlet के बजाय, यहाँ इस तरह से ऑब्जेक्ट सरणियों पर सीधे ForEach
पद्धति का उपयोग करने की संभावना है
(1..10).ForEach({$_ * $_})
या - यदि वांछित है - स्क्रिप्ट ब्लॉक के चारों ओर कोष्ठक छोड़ा जा सकता है
(1..10).ForEach{$_ * $_}
दोनों का परिणाम नीचे दिया जाएगा
1
4
9
16
25
36
49
64
81
100
जारी रखें
Continue
में ऑपरेटर काम करता है For
, ForEach
, While
और Do
लूप। यह लूप के वर्तमान पुनरावृत्ति को छोड़ देता है, अंतरतम लूप के शीर्ष पर कूद जाता है।
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
ऊपर 1 से 20 को कंसोल में आउटपुट करेगा लेकिन 7 नंबर को मिस करेगा।
नोट : पाइपलाइन लूप का उपयोग करते समय आपको Continue
बजाय return
उपयोग करना चाहिए।
टूटना
break
ऑपरेटर तुरंत एक प्रोग्राम लूप से बाहर निकल जाएगा। इसका उपयोग For
, ForEach
, While
Do
and loops या एक Switch
स्टेटमेंट में किया जा सकता है।
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
उपरोक्त 15 तक गिना जाएगा लेकिन 7 तक पहुंचते ही रुक जाएगा।
नोट : पाइपलाइन लूप का उपयोग करते समय, break
continue
। पाइपलाइन लूप में break
का अनुकरण करने के लिए आपको कुछ अतिरिक्त तर्क, cmdlet आदि को शामिल करने की आवश्यकता होती है, यदि आपको break
का उपयोग करने की आवश्यकता है तो गैर-पाइपलाइन लूप के साथ छड़ी करना आसान है।
लेबल तोड़ो
ब्रेक एक लेबल को भी कॉल कर सकता है जिसे लूप की तात्कालिकता के सामने रखा गया था:
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
नोट: यह कोड $i
से 8
और $j
से 13
$j
जाएगा जो $k
को बराबर 104
। चूँकि $k
100
से 100
, तो कोड दोनों छोरों से बाहर हो जाएगा।