حلقة PowerShell For: دليل شامل

عند استخدام سكربتات PowerShell لإدارة الأنظمة أو معالجة المهام الضخمة، ستحتاج بالتأكيد إلى استخدام بنية تكرار كجزء من السكربتات الخاصة بك. هناك العديد من أنواع الحلقات المتاحة في PowerShell، وأحد هذه الأنواع هو حلقة for loop. حلقة for في PowerShell يمكنها تشغيل نفس مجموعة الأوامر على عناصر متعددة بسرعة وإنتاج نتائج متسقة.

في هذه المقالة، ستتعرف على ما هي حلقة for في PowerShell، وستفهم بناء جملة الحلقة ومكوناتها. ستتعلم أيضًا من الأمثلة بعض الطرق المختلفة التي يمكنك استخدام حلقة for.

فهم جملة الحلقة for في PowerShell والعناصر البديلة

تُستخدم حلقة for في PowerShell عادةً عندما يكون عدد مرات تشغيل أمر أو عملية معروفًا بالفعل. على سبيل المثال، عندما ترغب في معالجة مجموعة فرعية فقط من القيم في مصفوفة (على سبيل المثال ، معالجة فقط 10 من إجمالي عدد العناصر X).

استخدام حلقة for يعطي مزيدًا من التحكم في الحدود والشروط عندما يجب أن ينتهي التعليمات البرمجية. يتم ذلك مقارنةً بـ حلقة foreach أو cmdlet ForEach-Object ، حيث يتوقف التكرار بعد معالجة آخر عنصر في المجموعة.

فيما يلي بناء جملة حلقة for للإشارة.

for (<Initial iterator value>; <Condition>; <Code to repeat>)
{
    <Statement list>
}

كما يمكن ملاحظة في صيغة الحلقة أعلاه، يمكن تقسيم جملة حلقة for في PowerShell إلى أربعة عناصر يجب عليك معرفتها. هذه العناصر هي العنصر الأولي، العنصر الشرط، العنصر التكرار، والعنصر قائمة التعليمات.

  • العلامة المؤقتة البدء هي المكان الذي تحدد فيه قيمة البداية. يتم قراءة هذه القيمة مرة واحدة فقط من قبل البيان. عادةً ما يقوم المبرمجون بتعيين هذه المتغيرة بقيمة صفر.
  • العلامة المؤقتة الشرط تحدد الحد أو الشرط الذي يحدد ما إذا كان الحلقة يجب أن تستمر في التشغيل أم يجب أن تنتهي. تقوم التعبيرات المستخدمة في هذه العلامة المؤقتة بتقييم القيمة إلى صحيحة.
  • العلامة المؤقتة التكرار تقبل أوامر متعددة. يتم تنفيذ الأوامر المقدمة في هذه العلامة المؤقتة بعد كل تكرار للحلقة وقبل إعادة تقييم العلامة المؤقتة الشرط. عادةً ما يستخدم المبرمجون هذا لتقديم تعبير يزيد من قيمة المتغير في العلامة المؤقتة البدء أو ينقص منها.
  • أخيرًا، العلامة المؤقتة قائمة التعليمات هي المكان الذي سيتم وضع الكود الرئيسي الذي ترغب في تشغيله. يتم تكرار الكود داخل هذه العلامة المؤقتة في حلقة حتى تعيد العلامة المؤقتة الشرط قيمة $False.

فهم تدفق تنفيذ حلقة For في PowerShell

لفهم كيف تعمل حلقة for في PowerShell بشكل أفضل، يجب أن تتعرف على تدفق تنفيذها. في البداية، تعتبر حلقة for عملية تتكون من أربع خطوات، ثم تتحول إلى عملية مكونة من ثلاث خطوات بعد التشغيل الأولي. لمزيد من التوضيح، استمر في قراءة الخوارزمية أدناه.

الخطوة 1

في بداية بيان حلقة for، يتم قراءة القيمة البدء وتخزينها في الذاكرة.

مثال: $num = 0

الخطوة 2

تقوم عبارة حلقة التكرار بتقييم نتيجة منطقية للتعبير داخل علامة البدلاء الشرط. إذا كانت النتيجة $false، يتم إنهاء حلقة التكرار for loop. إذا كانت النتيجة $true، فإن حلقة التكرار for loop تستمر إلى الخطوة التالية.

مثال: $num -lt 10

الخطوة 3

تقوم PowerShell بتشغيل الكود داخل علامة البدلاء قائمة الأوامر. يمكن أن يكون هناك أمر واحد أو أكثر، أو كتلة نصية، أو وظائف.

مثال: "أعد العد $num"

الخطوة 4

في هذه الخطوة، يتم تشغيل التعبير في علامة البدلاء كرر، مما سيحدث تحديثًا للقيمة الحالية لعلامة البدلاء الأولية. ثم، يتم العودة إلى الخطوة 2.

مثال: $num++

استخدام حلقة التكرار في PowerShell (أمثلة)

سيتم عرض أمثلة في الأقسام التالية حول كيفية استخدام حلقة التكرار بطرق مختلفة. قد لا تكون هذه الأمثلة ذات فائدة عملية أو حقيقية كما هي، ولكن التقنيات التي ستتعلمها يمكن أن ترشدك في استخدام حلقة التكرار إذا واجهت الحاجة الحقيقية لذلك.

الآن بعد أن فهمت كيفية عمل حلقة التكرار، حان الوقت لترى كيف يتم تجميع كل ذلك باستخدام كود أساسي.

الحصول على سلسلة من الأرقام

يعرض الكود أدناه سلسلة “أعد العد $num” مرارًا وتكرارًا على وحدة التحكم ابتداءً من 1 حتى تصل قيمة $num إلى 10.

for ($num = 1 ; $num -le 10 ; $num++){    "I count $num"}

عندما تنسخ الكود أعلاه وتلصقه في جلسة PowerShell الخاصة بك لتشغيله، يوضح لك اللقطة الشاشة أدناه النتيجة.

For loop example to display numbers less than 10

دمج السلاسل النصية

ليست عبارة عن تعابير رياضية فقط مثل الجمع والطرح والضرب، بل يمكن استخدامها أيضًا لدمج قيم السلاسل النصية.

سيقوم المثال أدناه بتكرار حرف “x” في كل سطر مع زيادة حرف واحد فقط في كل سطر حتى يصل عدد الأحرف في السطر إلى 30.

كما يمكن رؤية، تم تهيئة قيمة $x بـ '' والتي لا تحتوي على أي أحرف. الحد الذي يتم تحديده بناءً على الشرط هو عندما يصل عدد الأحرف الموجودة في قيمة $x إلى 30. بعد كل تكرار، يتم إضافة حرف “x” إضافي إلى قيمة $x.

for ($x='' ;$x.length -le 30;$x=$x+'x'){
    Write-Host $x
    Start-Sleep -Milliseconds 20
}

يوضح الإخراج أدناه النتيجة المتوقعة عند تشغيل الكود أعلاه في برنامج PowerShell.

String concatenation example using For Loop

دمج السلاسل النصية بمعاير بدء وتكرار متعددة

يمكن لمعاير “البدء” و “التكرار” في عبارة حلقة الـ for أن تقبل معايرات متعددة.

باستخدام الكود في المثال السابق، يمكن تعديل الكود لإضافة معاير جديد في مكان “التكرار” لاختيار لون عشوائي. سيتم استخدام اللون العشوائي كلون النص الذي سيتم عرضه في واجهة التحكم.

كما يمكن رؤية في السطر الأول، تم تعريف مصفوفة تحتوي على أسماء الألوان. ستقوم عملية حلقة الـ for بالاختيار العشوائي لاسم لون من هذه المصفوفة.

يرجى ملاحظة أن “البدء” و “التكرار” الآن يحتويان على تعابيرين. يتم وضع كل تعبير في قوسين معقوفين وفصلهما بفاصلة.

$colors = @("Green","Cyan","Red","Magenta","Yellow","White")
for (($x=''),($fgcolor = $colors | Get-Random) ;$x.length -le 30;($x=$x+'x'),($fgcolor = $colors | Get-Random)){
    Write-Host $x -ForegroundColor $fgcolor
    Start-Sleep -Milliseconds 20
}

بمجرد تشغيل الشيفرة المعدلة في PowerShell، سيتم عرض النتيجة المتوقعة أدناه.

String concatenation example using For Loop

عرض التقدم

ربما أكثر استخدام شائع لحلقة for هو عرض مؤشرات التقدم. يتم استخدام هذا بشكل رئيسي عند تشغيل المهام لعناصر متعددة قد تستغرق وقتًا لإنهائها. مثل إنشاء تقرير لجميع أحجام البريد الإلكتروني في منظمتك Exchange، أو تحديث سمات مستخدمين متعددين في Active Directory.

يعرض الشيفرة المثالية أدناه الطريقة الأساسية لعرض التقدم من 1 إلى 100٪. كما سترى، القيمة الأولية لـ $counter هي 1، وتشير الشرط إلى أن هذه الحلقة ستستمر حتى تصل قيمة $counter إلى 100.

for ($counter = 1; $counter -le 100; $counter++ )
{
		# أضف الشيفرة الخاصة بك هنا
    Write-Progress -Activity "Update Progress" -Status "$counter% Complete:" -PercentComplete $counter;
}

عند تشغيل الشيفرة أعلاه في PowerShell، يجب أن ترى إخراجًا مماثلاً، كما هو موضح أدناه.

Progress counter driven by for loop

عرض مؤقت عكسي

توضح الشيفرة التالية كيفية استخدام حلقة for لعرض مؤقت عكسي. يعرض هذا المؤقت العكسي فقط الثواني المتبقية، ابتداءً من 10.

إذا كنت ترغب في تغيير العدد البدء، فما عليك سوى تغيير قيمة المتغير $seconds في العنصر الابتدائي.

for ($seconds=10; $seconds -gt -1; $seconds--) {
    Write-Host -NoNewLine ("`rseconds remaining: " + ("{0:d4}" -f $seconds))
    Start-Sleep -Seconds 1
}

تشغيل الشيفرة أعلاه في PowerShell سيؤدي إلى الناتج المثالي أدناه.

A countdown timer that is driven by for loop

عرض مؤقت عكسي (حلقة for متداخلة)

ماذا لو أردت عرض مؤقت العد التنازلي بتنسيق “دقائق:ثواني”؟ يمكن استخدام حلقة الـ for المتداخلة لتحقيق ذلك. حلقة الـ for المتداخلة هي ببساطة حلقة for داخل حلقة for وهكذا.

الشيفرة المرفقة تحتوي على بيانين for.

تتعامل البيان الأول for مع العد التنازلي لجزء الدقيقة من المؤقت. كما ترى، هناك متغير $minutes قبل حلقة الـ for حيث تحتاج إلى تحديد عدد الدقائق التي ستقوم حلقة الـ for بعد العد منها.

البيان الثاني for يتعامل مع العد التنازلي لجزء الثواني من المؤقت. بعد كل تكرار، تتوقف الحلقة لمدة ثانية واحدة قبل الاستمرار. وستستمر في القيام بذلك حتى يصل قيمة $seconds إلى 0.

# تعيين عدد الدقائق للعد
$minutes = 1

for ($minutes--; $minutes -gt -1; $minutes--)
{
    for ($seconds = 59 ; $seconds -gt -1 ; $seconds--)
    {
        $remaining = ("{0}:{1}" -f ("{0:d4}" -f $minutes),("{0:d2}" -f $seconds))
        Write-Host "`r$remaining" -NoNewline
        Start-Sleep -Seconds 1
    }
}

عند تشغيل الشيفرة أعلاه، سيكون هذا هو شكل مؤقت العد التنازلي.

A Countdown timer using nested for loop

تحديد الأعداد الأولية

حلقة الـ for في PowerShell هي خيار جيد أيضًا للعمليات الرياضية. في هذا المثال، تستخدم حلقة الـ for لتحديد ما إذا كان العدد المعطى هو عدد أولي أم لا.

A prime number is a number that is only divisible by 1 and N, where N is the number itself. For example, if the value of N is 7, then N divided by 1 is 7 divided by 1.

سيقوم السكريبت أدناه، عند تنفيذه، بتنفيذ الخطوات التالية:

  • استدعاء المستخدم لإدخال رقم.
  • إجراء القسمة باستخدام العدد المدخل كمقسوم عليه، والمقسومات هي الأعداد من 2 إلى العدد المدخل ناقص 1. وهذا يعني أنه إذا كان القيمة المدخلة هي 7، فإن المقسومات هي 2، 3، 4، 5 و 6 على التوالي.
  • إذا كان الناتج عبارة عن عدد صحيح، فهذا يعني أن العدد المدخل ليس عددًا أوليًا وبالتالي سيتم إيقاف حلقة التكرار.
  • إذا كان الناتج ليس عددًا صحيحًا، فهذا يعني أن العدد المدخل هو عدد أولي.

انسخ واحفظ هذا السيناريو باسم isPrime.ps1

$num = Read-Host "Input a number"

$isPrime = $true
for ($y = 2 ; $y -lt $num ; $y++ )
{
    if (($num / $y) -is [int]) {
        Write-Host "$num is not a prime number"
        $isPrime = $false
        break
    }
}

if ($isPrime -eq $true) {
    Write-Host "$num is a prime number"
}

بمجرد حفظ سيناريو isPrime.ps1 ، قم بتشغيله في PowerShell للفحص. لتوضيح ذلك، انظر إلى الناتج النموذجي أدناه.

Using for loop in a script to determine a prime number

ملخص

حلقة التكرار for في PowerShell لا تحمل أي مفاجآت عند مقارنتها بكيفية عمل حلقة التكرار for المستخدمة في لغات أخرى – وهذا يجعلها أسهل في التكيف إذا كنت لست جديدًا على هذه الفكرة.

في هذه المقالة ، تعلمت أساسيات عبارة حلقة التكرار for في PowerShell. لقد تعلمت بشأن بناء الجملة النحوية والمنطق والتدفق ، وتعلمت أيضًا من عدة أمثلة حول كيفية استخدامها لأغراض مختلفة.

تذكر أنه وعلى الرغم من وجود أنواع أخرى من حلقات التكرار في PowerShell ، فإن القول بأن نوعًا واحدًا أفضل من الآخر غير عادل. كل شيء يعتمد على هدف الشفرة وتفضيل الشخص الذي يكتب الشفرة.

باستخدام المعرفة التي اكتسبتها من هذه المقالة ، يجب أن تتمكن من إيجاد طرق لاستخدام حلقة التكرار for أكثر لتلقين مهامك المملة المعتادة.

قراءة إضافية

Source:
https://adamtheautomator.com/powershell-for-loop/