الحلقة التكرارية في PowerShell: دليل عملي الأساسي

باور شيل هو لغة سيناريو قوية توفر العديد من الميزات للتشغيل التلقائي وإدارة الأنظمة القائمة على نظام Windows. أحد أكثر البنى المستخدمة بشكل شائع هو حلقة while في PowerShell.

لا تقلق إذا كنت قد تعثرت في حلقة لانتهاء النهاية أثناء محاولة تعلم سكربت باور شيل. دع حلقة while في باور شيل ترشدك إلى الهروب الكبير. وفي هذا البرنامج التعليمي، ستعود إلى أساسيات العمل مع حلقات while في باور شيل أثناء كتابة سكربتاتك.

استمر في القراءة لرفع مهارات سكربت باور شيل إلى المستوى التالي!

المتطلبات المسبقة

  • A Windows machine – This tutorial uses Windows 10.
  • يجب أن يكون لديك Windows PowerShell 5.0 أو أحدث مثبتًا – يستخدم هذا البرنامج التعليمي PowerShell 7.
  • A user account with administrator privileges.

تنفيذ حلقات while بشرط واحد

أحد أنواع حلقة while الأبسط هو نوع الشرط الفردي. على عكس عبارة If، تنفذ هذه الحلقة نوعًا معينًا من الأوامر طالما يُقَدَّر الشرط المحدد بأنه صحيح. عندما يتم إرجاع “False”، تتوقف الحلقة ويستمر التنفيذ مع باقي السيناريو.

أدناه هو بناء الجملة لحلقة الـwhile مع شرط واحد:

  • أول شيء ستلاحظه هو استخدام الأقواس. يجب أن يتم إحاطة الشرط بالأقواس، بينما يعتبر كتلة الشفرة مجموعة من أوامر PowerShell التي تُنفذ بينما الشرط صحيح.
  • الشيء الثاني الذي يجب ملاحظته هو أن الشرط يجب أن يعيد قيمة بوليانية، التي تُقيم إما إلى صحيح أو خطأ.
while (condition)
{

	# كتلة الشفرة للتنفيذ

}

قم بتشغيل الشفرة أدناه، حيث يبدأ قيمة $val بالقيمة 0 ويتم زيادتها بمقدار 1 في كل مرة يتم تنفيذ كتلة الشفرة حتى تصل قيمة متغير $val إلى 3.

عندما تصل $val إلى قيمة 3، التي تجعل الشرط خطأ، يتم كسر الحلقة، ويستمر التنفيذ مع بقية النص البرمجي.

# يعلن عن متغير $val بالقيمة الابتدائية 0
$val = 0

# يعيد حلقة الـwhile للتشغيل حتى تصل قيمة المتغير $val إلى 3
while($val -ne 3)
{
	# يزيد قيمة المتغير $val بمقدار 1
	$val++
	
	# يطبع القيمة الحالية للمتغير $val
	Write-Host $val
}
Understanding Single Condition While Loops.

تنفيذ حلقة While في PowerShell مع المتغيرات المدمجة ($true/$false)

المثال السابق، باستخدام الشروط في حلقة while، يعمل بشكل جيد. ولكن يمكنك أيضًا استخدام المتغيرات المدمجة في PowerShell، مثل $true و $false، لإنشاء حلقة While.

الصيغة أدناه تُنفذ حتى لا يكون $true بعد الآن $true. بمعنى آخر، تعمل الحلقة إلى الأبد. ولكن يجب عليك دائمًا تضمين طريقة للخروج من حلقة لا نهائية. خلاف ذلك، ستبقى محبوسًا إلى الأبد. ستتعلم المزيد حول كيفية الخروج من حلقة باستخدام break و continue لاحقًا في هذا البرنامج التعليمي.

while($true)
{

	# كتلة الكود للتنفيذ

}

قم بتنفيذ كتلة الكود أدناه، التي تعمل بشكل دائم، وتطبع قيمة $i إلى وحدة التحكم.

# يعلن عن المتغير $i بالقيمة الابتدائية 0
$i = 0

# يحدد حلقة While لتعمل بينما الشرط $true
while($true)
{
	# يزيد قيمة $i بمقدار 1
	$i++
	
	# يطبع قيمة المتغير $i الحالية
	Write-Host $i
}

الآن، اضغط على Ctrl+C للخروج من الحلقة. تستهلك هذه الحلقة العديد من موارد النظام، لذا كن حذرًا عند استخدامها.

Executing a while loop with PowerShell’s built-in ($true) variable

تنفيذ حلقات While متعددة الشروط

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

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

  • و (-and) – يجب أن تكون كل الشروط صحيحة.
  • أو (-or) – يمكن أن يكون أحد الشروط صحيحًا.
# عامل AND
while (condition1 -AND condition2)
{

	# كتلة الشيفرة للتنفيذ

}

# عامل OR
while (condition1 -OR condition2)
{

	# كتلة الشيفرة للتنفيذ

}

قم بتنفيذ الشيفرة أدناه، حيث تكرر while ما دامت قيمة $val ليست متساوية (-ne) لـ 3 -and قيمة $i ليست متساوية (-ne) لـ 5.

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

# تعلن عن المتغيرات $val و $i بقيم افتراضية تساوي 0
$val = 0
$i = 0

# تعيين حلقة التكرار While لتنفيذها حتى يساوي $val 3 و $i 5
while($val -ne 3 -and $i -ne 6)
{
	# زيادة قيمة $val بمقدار 1
  $val++
	# زيادة قيمة $i بمقدار 2
  $i += 2
	# يطبع قيمة المتغيرات $val و $i الحالية
  Write-Host "$val, $i"
}

تنفيذ حلقة while مع المشغل AND

Executing a while loop with AND operator

الآن، قم بتنفيذ الكود أدناه، الذي يطلب من المستخدم عمره، ويخزنه في المتغير $age.

إذا أدخل المستخدم رقمًا أقل من (-lt) 1 أو ليس رقمًا (-nomatch)، يُطلب من المستخدم مرة أخرى إدخال رقم صالح. هذا السلوك مفيد في منح المستخدمين فرصًا متعددة لإدخال إدخال صالح.

# يطلب من المستخدمين إدخال عمرهم
$age = Read-Host "Please Enter Your Age"

# تعيين حلقة التكرار While لتشغيلها حتى يقدم المستخدم إدخالًا صالحًا
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# يُعيد طلب المستخدم إدخال عمر صالح
  $age = Read-Host "Please Enter Your Valid Age"
}
# يطبع الإدخال العمري الصالح
Write-Host "Your age is $age

في الناتج أدناه، يمكنك أن ترى أن المستخدم طلب منه إدخال عمره ثلاث مرات، على النحو التالي:

  • أول مرة، دخل المستخدم عشرة، وهو ليس رقمًا.
  • المرة الثانية، دخل المستخدم 0، وهو أقل من 1.
  • المرة الثالثة، دخل المستخدم 10، وهو عمر صالح.
Executing a while loop with the OR operator

استخدام كلمات BREAK و CONTINUE في حلقات الـ While

لقد رأيت كيف تضيف حلقات الـ While مرونة إلى نص برمجي PowerShell الخاص بك. ولكن للتحكم بشكل أفضل في تنفيذ حلقات While الخاصة بك، أضف كلمتي الـ BREAK والـ CONTINUE.

على سبيل المثال، إذا كنت تريد فقط معالجة عدد معين من العناصر في مصفوفة، يمكنك استخدام كلمة BREAK للخروج من الحلقة عند معالجة العدد المطلوب من العناصر.

تعمل هذه الكلمات كما يلي:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

قم بتنفيذ الكود أدناه، الذي يكرر عبر مجموعة من 10 عناصر.

في الكود أدناه، يتحقق البيان الشرطي if من قيمة $i. إذا كانت قيمة $i هي 5، فإن كلمة CONTINUE تتخطى الشيفرة المتبقية في الحلقة وتستمر مع التكرار التالي. إذا كانت قيمة $i هي 8، فإن كلمة BREAK تخرج من الحلقة وتستمر مع بقية النص البرمجي.

وإلا، فإن حلقة الـ While تقوم بطباعة (Write-Host) وتزيد قيمة متغير $i بمقدار 1.

# يعلن عن مصفوفة تحتوي على 10 عناصر
$array = 1..10
# يعلن عن متغير $i بقيمة ابتدائية 0
$i = 0
# يحدد الحلقة While لتنفيذها حتى تتحقق الشرط
while($i -lt $array.Count)
{
	# يتحقق مما إذا كان $i يساوي 5
  if($i -eq 5)
  {
		# إذا كان الأمر كذلك ، يزيد $i بمقدار 1
    $i++
		# يستمر بالتكرار التالي
    continue
  }
	# يتحقق مما إذا كان $i يساوي 8
  if($i -eq 8)
  {
		# إذا كان الأمر كذلك ، يكسر حلقة While ويستمر في بقية النص
    break
  }
	# يطبع القيمة الحالية لـ $i
  Write-Host "Processing item $i"
	# يزيد $1 بمقدار 1
  $i++
}

كما يمكنك رؤية في الناتج أدناه ، تجاوزت الحلقة العناصر الخامسة والثامنة في المصفوفة. قامت الحلقة while بمعالجة جميع العناصر الأخرى في المصفوفة وخرجت بعد الوصول إلى العنصر الثامن.

Executing a while loop with break and continue keywords

تحديد الوقت الذي تعمل فيه حلقة While

عادةً ما ترغب في تحديد مدى زمن تعمل فيه الحلقة. ربما تحاول الاتصال بخادم عن بعد. إذا كان الأمر كذلك ، يمكنك منح الخادم الوقت للرد قبل انتهاء المهلة والخروج من الحلقة باستخدام أمر Start-Sleep داخل الحلقة while.

الأمر Start-Sleep يعلق تنفيذ السكريبت لمدة زمنية محددة.

قم بتنفيذ الكود أدناه للحصول على التاريخ والوقت الحالي وتخزينه في المتغير $startTime. يعمل حلقة while بينما يكون التاريخ/الوقت الحالي أقل من 10 ثوانٍ من القيمة المخزنة في $startTime.

أثناء تشغيل حلقة while، يتم طباعة رسالة بينما يعلق أمر Start-Sleep تنفيذ السكريبت لمدة 1 ثانية.

يعد الكود أدناه نموذجًا أساسيًا لما قد تستخدمه فعليًا في الممارسة. يمكنك إضافة المزيد في الكود داخل الحلقة حسب الحاجة.

# احصل على التاريخ/الوقت الحالي وقم بتخزينه
$startTime = Get-Date
# قم بتعيين حلقة While لتشغيلها بينما يكون التاريخ/الوقت الحالي أقل من 10 ثوانٍ
	# من القيمة المخزنة في $startTime.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# قم بطباعة رسالة
  Write-Host "Waiting for server to respond..."
	# قم بتعليق النص البرمجي لثانية واحدة
  Start-Sleep -Seconds 1
}

أدناه، يمكنك رؤية استمرار تشغيل الحلقة لمدة 10 ثوانٍ قبل الخروج من الحلقة.

Limiting the time a while loop runs

الختام

تكون حلقات PowerShell while مفيدة عند التعامل مع مفاهيم معقدة لتجنب الوقوع في حلقة لا نهاية لها أثناء كتابة النصوص البرمجية. وفي هذا البرنامج التعليمي، لقد تعلمت العديد من الطرق للعمل مع حلقات while للحصول على نصوص أكثر مرونة وقوة.

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

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