חזרה ליסודות: לוגיקת תנאי עם הצהרת התנאי של PowerShell

מאמר זה עודכן לשנת 2023!

סקריפטים יכולים לקבוע החלטות. איך? על ידי שימוש במושג הנקרא לוגיקת תנאי. הפקודה if של PowerShell ובניית התנאי if/else הם הדרכים הנפוצות להגדרת תנאים.

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

במאמר זה, תלמד את בניית התנאי If-Else של PowerShell ותבין את התחביר שלו ואיך הוא פועל. תלמד גם כמה דרכים שבהן אפשר להשתמש בפקודה If של PowerShell כדי להוסיף טיפול בלוגיקת תנאים בסקריפטים שלך מהדוגמאות.

הבנת תחביר התנאי של PowerShell

בניית התנאי if-else של PowerShell מעריכה אחת או יותר של ביטויים תנאי. למטה תראה את תחביר הפקודה if. סגנון זה נקרא לעיתים קרובות שליטת זרימה.

if (<test1>)
    {<statement list 1>}
[elseif (<test2>)
    {<statement list 2>}]
[else
    {<statement list 3>}]

כפי שאתה יכול לראות מהתחביר למעלה, כל בדיקה מוקפת בסוגריים (). בדיקות יכולות להשתמש באופרטורים שונים, כגון אופרטורים להשוואה ו־אופרטורים לוגיים,

רשימות הפקודות מכילות את הקוד המיועד להרץ אם תוצאת הבדיקה מעריכה לtrue.

אז, יש שלושה הצהרות אפשריות בקבוצת הצהרת If. אלה הם ההצהרה IF, ELSEIF, ו ELSE.

  • ההצהרה if מכילה את הבדיקה הראשונה לשיקול, לאחריה מגיעה רשימת ההצהרות הראשונית המקוננת בתוך סוגריים מסולסלים {}.ההצהרה if ב-PowerShell היא ההצהרה היחידה שחובה להופיע.
  • ההצהרה elseif היא המקום בו אתה מוסיף תנאים. אתה יכול להוסיף מספר ElseIf הצהרות כאשר יש לך מספר תנאים. PowerShell יבצע בדיקה של כל אחת מהתנאים הללו לפי סדר.
  • ההצהרה else אינה מקבלת תנאי. רשימת ההצהרות בהצהרה זו מכילה את הקוד להפעלה אם כל התנאים הקודמים נבדקו והתבררו כשקרים.

הבנת הזרימה הלוגית של הצהרת If של PowerShell

כדי להבין יותר טוב איך עובדת ההצהרה If-Else של PowerShell, כדאי להכיר את זרימת הלוגיקה שלה. התרשים למטה ממחיש את זרימת הבסיס של ההצהרה If-Else של PowerShell.

PowerShell If Statement Logic Flow

כאשר ההצהרה if רצה, PowerShell עוברת דרך כל תנאי ומבצעת בדיקה אם הקוד מחזיר אמת או שקר. סיכום של התנהגות ההצהרה היא:

  • PowerShell מבצעת בדיקה של התנאי ב- בדיקה 1.
  • אם תוצאת בדיקה 1 מחזירה אמת, הקוד בתוך רשימת ההצהרות של ה-if ירוץ, ואז PowerShell ייצא מההצהרה If.
  • אם תוצאת בדיקה 1 מחזירה שקר, PowerShell ממשיכה לבדוק את התנאי (בדיקה n) בהצהרת ElseIf הבאה.
  • אם תוצאת מבחן n מחזירה שקר, PowerShell ממשיך לבדוק את התנאי (מבחן n) בהצהרת ElseIf הבאה, אם קיימת הצהרת ElseIf נוספת -או-
  • אם תוצאת מבחן n מחזירה שקר, הקוד בהצהרת Else יתבצע, ו-PowerShell יצא מההצהרה If -או-
  • אם תוצאת מבחן n מחזירה נכון, הקוד בהצהרת ElseIf יתבצע, ו-PowerShell יצא מההצהרה If.

שימוש בהצהרת If-Else ב-PowerShell

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

תנאי יחיד If-Else

נתחיל עם הדבר הכי בסיסי, ההצהרה היחידה של PowerShell If. עליך להשתמש בהצהרת if יחידה כאשר יש רק תנאי אחד לבדיקה.

הדוגמה למטה בודקת האם ערך המשתנה $num גדול מ-10. אם התוצאה היא נכונה, התוצאה שאומרת "$num הוא גדול מ-10" תוצג על המסך. אם התוצאה היא שקר, PowerShell לא יעשה כלום מאחר ויש רק תנאי אחד לבדיקה.

$num = 11
if ($num -gt 10) {
    "$num is greater than 10"
}

אם אתה בודק רק ערך ספציפי, כמו if ($Value) { }, PowerShell יבדוק אם ה-$Value אינו $Null, 0, $False, מחרוזת ריקה או מערך ריק.

הדבקת הקוד למערכת הפעלה PowerShell תספק לך את התוצאה הבאה:

Single If Condition Example

עכשיו, תוכל להוסיף את ההוראה Else אם ברצונך להוסיף פעולת "גיבוי" ברירת מחדל במקום לא לתת ל-PowerShell לעשות כלום כשתוצאת הבדיקה שקרה.

בדוגמה שלמטה, הקוד בהוראת Else ירוץ אם ערך המשתנה $num אינו גדול מ-10.

$num = 9
if ($num -gt 10)
{
    "$num is greater than 10"
}
else
{
    "$num is NOT greater than 10"
}

הרצת הקוד המשונה ב-PowerShell תן לך את הפלט המוצג למטה.

Single If statement condition

החל מ-PowerShell 7.0, תחביר חדש עבור הוראת If הוזן באמצעות אופרטור טרנרי. הוראות If יחידות יכולות להשתמש היטב בתחביר החדש הזה.

בשימוש באותה דוגמה למעלה, כך תראה הקוד עם אופרטור טרנרי.

$num = 11
$num -gt 10 ? "$num is greater than 10" : "$num is NOT greater than 10"
If statement syntax using ternary operator

בדיקת $Null בהוראת If של PowerShell

עשוי להיחשב ככל היית מניח שבדיקת תנאי לתנאי $Null היא ישירה. אך, הצד שבו מניחים את ערך ה- $Null חשוב מאוד מאחר והתוצאה לא בהכרח תהיה זהה בכל תנאי. כדאי לנהוג להשתמש תמיד בתנאי $Null בצד שמאל כך.

$Null -NE $Value

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

$List = @(1,2,2,3,4)
$List -NE $Null
$List -EQ $Null
$Null -NE $Null
$Null -EQ $Null
$Null testing conditions for PowerShell If Statement

תנאי If-Else מרובים עם ElseIf

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

התסריט למטה, כאשר מופעל, ימשיך לדרוש שם פריות עד ללחיצת מקש CTRL+C, או עד שהמשתמש מזין את האות "X".

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

While ($fruit -ne "X") {
    $fruit = Read-Host "Name that fruit"

    if ($fruit -eq 'Apple') {
        'I have an Apple'
    }
    elseif ($fruit -eq 'Banana') {
        'I have a Banana'
    }
    elseif ($fruit -eq 'Orange') {
        'I have an Orange'
    }
    else {
        'Sorry, that fruit is not in the list'
    }
}

למטה מוצג דמויות של התנהגות התסריט לעיל בזמן הרצתו ב-PowerShell.

Multiple If-Else conditions

דיווח על מצב של מקום פנוי בדיסק

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

Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$_.DriveType -eq 3}

המידע שהקוד למעלה יחזיר ייראה כמו בצילום המסך הבא.

Plain disk space information report

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

שימוש בהצהרת If של PowerShell כדי לשפר את הקוד

A more intuitive output can be achieved using the PowerShell If-Else statement by adding conditions to check if the free space is over or below certain thresholds. And these thresholds will define the status of the free disk space.

התסריט לדוגמה למטה מבצע את הפעולות הבאות:

  • על ידי ערך המשתנה $Critical, מגדיר את הסף לו ייהיו ציונים של אחוז המקום הפנוי החופפים כ- קריטי.
  • שימוש בערך של המשתנה $Warning, הגדר את הסף שבו יותוו באחוז המקום החופשי כ-אזהרה.
  • קבל את כל מידע דיסק קבוע מהמחשב המקומי
  • עבור בכל מידע הדיסק כדי לקבוע את המקום החופשי ולתייג את מעמדו.
    • אם אחוז המקום החופשי גבוה מערך המשתנה $Warning, מציין את מעמד המקום בתגית רגיל.
    • אם אחוז המקום החופשי גבוה מערך המשתנה $Critical, מציין את מעמד המקום בתגית אזהרה.
    • אם אחוז המקום החופשי נמוך או שווה לערך המשתנה $Critical, מציין את מעמד המקום בתגית קריטי.
  • מיקם את תכונות העצם 'אות הדיסק', 'שם הדיסק', 'המקום הכולל (GB)', 'המקום החופשי (GB)', 'אחוז המקום החופשי (%)', ו- 'סטטוס'.
  • החזר את הדו"ח הסופי.

העתק את הקוד למטה ושמור את הסקריפט בשם הקובץ Get-DiskSpace.ps1. אל תשכח לשנות את ערכי המשתנים $Critical ו-$Warning כדי לבדוק עם סף שונה.

# הגדר סף באחוזים
$Critical = 20
$Warning = 70

# קבל את כל מידע דיסקים הנתמכים
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object { $_.DriveType -eq 3 }

# אתחל מערך ריק שיכיל את התוצאות הסופיות
$finalReport = @()

# עבור כל מידע על הדיסק
$diskObj.foreach(
    {
        # חשב את אחוז המקום החופשי
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)

        # קבע את "המצב"
        if ($percentFree -gt $Warning) {
            $Status = 'Normal'
        }
        elseif ($percentFree -gt $Critical) {
            $Status = 'Warning'
        }
        elseif ($percentFree -le $Critical) {
            $Status = 'Critical'
        }

        # הרכב את תכונות האובייקט להוספה לדו"ח
        $tempObj = [ordered]@{
            'Drive Letter'     = $_.DeviceID
            'Drive Name'       = $_.VolumeName
            'Total Space (GB)' = [int]($_.Size / 1gb)
            'Free Space (GB)'  = [int]($_.FreeSpace / 1gb)
            'Free Space (%)'   = "{0}{1}" -f [int]$percentFree, '%'
            'Status'           = $Status
        }

        # הוסף את האובייקט לדו"ח הסופי
        $finalReport += New-Object psobject -property $tempObj
    }
)

return $finalReport

באפשרותך גם להקצות את תוצאת התנאי if/else למשתנה, לדוג' $Status = if ($percentFree -gt $Warning) { 'Normal' } כדי ליצור תנאי קצר יותר אולי.

לאחר שהסקריפט נשמר, נסה אותו על ידי קריאה לשמו ב-PowerShell. להלן הדגמה של איך הסקריפט פועל.

Free Disk Space Status Command Output

כפי שניתן לראות מהפלט, ה-מצב של כל דיסק נקבע על ידי אחוז המקום החופשי בדיסק, שהוא תוצאה של שימוש בתנאים מרובים עם If-Else ב-PowerShell.

תנאים מרובים ומקוננים

תניחו שיש לך הצהרת if-else עם תנאי שמוגדר בבלוק ה-else. כאשר ההצהרה if-else רצה, בלוק ה-else נקרא אם הקוד בתוך בלוק ה-if מחזיר שקר.

בתוך בלוק ה-else, עליך לבצע בדיקה תנאית נוספת. כתוצאה, נדרשת הצהרת If-Else נוספת. סצנריו זה נקרא If-Else מקוננים. ההצהרה if-else מקוננת בדרך כלל משמשת אם ה-If-Else הפנימי תלוי בתוצאת הפעולה ב-If-Else החיצוני.

שימוש בהצהרות If-Else מרובות ומקוננות יכול להיות מבלבל למדי. הנקודה המרכזית היא לזכור את מיקום המסגרת ולוודא שאתה מזמין את הקוד שלך. המיקום של הקוד שלך יעזור לך לזהות ולהפריד בקלות את ההצהרות ה-If-Else שלך.

דוגמה להצהרות If-Else מרובות/מקוננות

התסריט הדוגמא שלהלן מראה כיצד ההצהרות If-Else מרובות ומקוננות יכולות להיות תלויות זו בזו. הלוגיקה של הקוד למטה היא כדלקמן.

  • אם $SendEmail הוא $false, התסריט לא יעשה כלום ויצא.
  • אם $SendEmail הוא $true, אז המשתנים $From ו-$To חייבים לא להיות ריקים או null. אחרת, המשתנה $abortFlag יוגדר ל-1.
  • אם $SendEmail הוא $true ו-$CCEnabled הוא $true, אז המשתנה $CC חייב להיות לא ריק או null. אחרת, המשתנה $abortFlag יוגדר ל-1.
  • אם המשתנה $SendEmail הוא $true והמשתנה $BCCEnabled הוא $true, אז המשתנה $BCC לא יכול להיות ריק או null. אחרת, המשתנה $abortFlag יוגדר ל־1.
  • אם ערך המשתנה $abortFlag הוא 1, הסקריפט יסיים בנקודה זו ולא ימשיך.
  • אם ערך המשתנה $abortFlag הוא 0, הסקריפט ימשיך עד לסיום.

העתק את הקוד למטה ושמור אותו כ־Send-MyMail.ps1. אל תשנה את ערכי המשתנים כרגע.

$SendEmail = $true

$From = ""
$To = ""

$CCEnabled = $true
$CC = ""

$BCCEnabled = $true
$BCC = ""

$abortFlag = 0

if ($SendEmail) {
    if (!$From) {
        Write-Host "[From] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if (!$To) {
        Write-Host "[To] is missing" -ForegroundColor Red
        $abortFlag = 1
    }

    if ($CCEnabled) {
        if (!$CC) {
            Write-Host "[CC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($BCCEnabled) {
        if (!$BCC) {
            Write-Host "[BCC] is missing" -ForegroundColor Red
            $abortFlag = 1
        }
    }

    if ($abortFlag -eq 1) {
        Write-Host "The abort flag has been tripped. Exit script." -ForegroundColor Red
        break
    }
    else {
        Write-Host "Your email will be sent from this address $From" -ForegroundColor Green
        Write-Host "And will be sent to the following people:" -ForegroundColor Green
        Write-Host "To: $To" -ForegroundColor Green

        if ($CCEnabled -and $CC) {
            Write-Host "CC: $CC" -ForegroundColor Green
        }

        if ($BCCEnabled -and $BCC) {
            Write-Host "BCC: $BCC" -ForegroundColor Green
        }
    }
}

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

Nested If-Else example

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

$SendEmail = $true

$From = "[email protected]"
$To = "[email protected]"

$CCEnabled = $true
$CC = "[email protected]"

$BCCEnabled = $true
$BCC = "[email protected]"

---SNIP---

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

Another nested If-else example

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

סיכום

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

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

מה דעתך על ההצהרה If-Else? האם אתה חושב שתשתמש בה יותר ויותר לאחר קריאת המאמר הזה? אילו מטרות נוספות ניתן לשקול עבורן אפשר להחיל את הידע שצברת כאן?

למידע נוסף

Source:
https://adamtheautomator.com/powershell-if-else/