לולאת ה-While של PowerShell: מדריך חזרה ליסודות

פוורשל הוא שפת תסריטים עוצמתית שמספקת המון יכולות לאוטומציה וניהול מערכות הפעלה במערכות הפעלה באמצעות חלונות. אחת מהבניות הנפוצות ביותר היא לולאת while של פוורשל.

אל תדאג אם תתעקש בלולאה אינסופית בניסיון ללמוד תסריטים של פוורשל. הנהלת הלולאת while של פוורשל תדריך אותך ליציאה הגדולה שלך. ובמדריך זה, תקפוץ חזרה ליסודות העבודה עם לולאות while בפוורשל בעודך כותב את התסריטים שלך.

המשך לקרוא כדי לשפר את כישורי התסריט שלך בפוורשל לרמה הבאה!

דרישות מוקדמות

מדריך זה יהיה דגמון מעשי. כדי לעקוב אחרי, הקפד לו יש:

  • A Windows machine – This tutorial uses Windows 10.
  • התקנת PowerShell 5.0 או גרסה גבוהה יותר – מדריך זה משתמש בפוורשל 7.
  • A user account with administrator privileges.

ביצועי לולאת while עם תנאי יחיד

אחת מסוגי הלולאות הפשוטות ביותר היא הסוג עם תנאי יחיד. בניגוד להצהרת If, סוג זה של לולאה מבצעת קבוצה של פקודות נתונות כל עוד תנאי מסוים מתקיים. כאשר מתקבל 'שקר', הלולאה נשברת והביצוע ממשיך עם שאר התסריט.

למטה התחברות התחברות לתנאי יחיד 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 (-and) – שני התנאים חייבים להיות אמת.
  • OR (-or) (אחד התנאים יכול להיות אמת).
# אופרטור AND
while (condition1 -AND condition2)
{

	# בלוק קוד לביצוע

}

# אופרטור OR
while (condition1 -OR condition2)
{

	# בלוק קוד לביצוע

}

הריצו את הקוד למטה, המשך ללולאת while כל עוד $val אינו שווה (-ne) ל־3 וגם $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/