العودة إلى الأساسيات: المنطق الشرطي باستخدام If Statement في PowerShell

تم تحديث هذا المقال لعام 2023!

النصوص يمكنها اتخاذ قرارات. كيف؟ عن طريق استخدام مفهوم يُسمى المنطق الشرطي. تعتبر البيانات الشرطية if في PowerShell وبنية if/else الطرق الشائعة لتعريف الشروط.

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

في هذا المقال، ستتعلم بنية If-Else في PowerShell وتفهم بناءها النحوي وكيفية عملها. كما ستتعلم بعض الطرق التي يمكنك استخدام بيان PowerShell If لإضافة التعامل مع المنطق الشرطي في نصوصك من الأمثلة.

فهم بنية البيان الشرطي If في PowerShell

تقوم بنية if-else في PowerShell بتقييم تعبيرات شرطية واحدة أو أكثر. أدناه سترى بناء البيان الشرطي If. يُطلق على هذا النمط في كثير من الأحيان التحكم في التدفق.

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

كما يمكن ملاحظة من النحو أعلاه، تكون كل اختبار محاطة بأقواس (). يمكن أن تستخدم الاختبارات مشغلات مختلفة، مثل مشغلات المقارنة و المشغلات المنطقية,

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

ثم، هناك ثلاثة عبارات ممكنة في مجموعة If statement. هذه هي عبارات IF، ELSEIF، وELSE.

  • تحتوي عبارة if على أول اختبار للتقييم، تليها قائمة البيانات الأولى المحاطة بالأقواس المعوجة {}. تعتبر عبارة PowerShell if العبارة الوحيدة المطلوبة للوجود.
  • تُستخدم عبارة elseif لإضافة الشروط. يمكنك إضافة عدة عبارات ElseIf عندما يكون لديك شروط متعددة. سيقوم PowerShell بتقييم كل من هذه الشروط بشكل تسلسلي.
  • لا تقبل عبارة else أي شرط. تحتوي قائمة البيانات في هذه العبارة على الكود الذي يجب تشغيله إذا كانت جميع الشروط السابقة المختبرة خاطئة.

فهم منطق عبارة If في PowerShell

لفهم أكبر لكيفية عمل عبارة PowerShell If-Else، اطلع على منطقها. يوضح الرسم البياني أدناه الجريان الأساسي لعبارة PowerShell If-Else.

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 مفرد

نبدأ بالأساسيات، وهو بيان If مفرد في PowerShell. يجب استخدام بيان 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 إذا كنت ترغب في إضافة “fallback” افتراضية بدلاً من السماح لـ 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

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

استخدام تعليمة PowerShell If لتحسين الكود

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، يتم وضع علامة على حالة مساحة القرص كـ حرج.
  • قم بتكوين خصائص الكائن 'حرف القرص'، 'اسم القرص'، 'المساحة الإجمالية (غيغابايت)'، 'المساحة الفارغة (غيغابايت)'، 'المساحة الفارغة (%)'، و 'الحالة'.
  • الرجاء إعادة التقرير النهائي.

انسخ الكود أدناه واحفظ النص البرمجي بالاسم 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

كما يمكن ملاحظة من الإخراج، فإن الحالة لكل قرص يتم تحديدها بواسطة نسبة مساحة القرص الحرة، والتي كانت نتيجة استخدام شروط متعددة مع PowerShell If-Else.

شروط متعددة ومتداخلة If-Else

لنفترض أن لديك عبارة شرطية if-else مع شرط محدد في كتلة else. عند تشغيل البيان الشرطي if-else، يتم استدعاء كتلة else إذا كان الكود داخل كتلة if يعيد قيمة خاطئة.

داخل كتلة else، تحتاج إلى إجراء اختبار شرطي آخر. نتيجة لذلك، تحتاج إلى عبارة If-Else أخرى. يُطلق على هذ scenario اسم 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 فارغًا أو معلومة. وإلا، سيتم تعيين متغير $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 في PowerShell. تتيح جملة If-Else للمبرمجين صياغة المنطق الشرطي وتوجيه إجراءات النصوص الخاصة بهم بناءً على نتائج الاختبارات.

باستخدام الأمثلة الموجودة في هذا المقال، يجب أن تكون قد تعلمت الطرق والتقنيات لاستخدام جملة If-Else عند إنشاء نصوص القرارات. يمكن أن تكون جملة If-Else بسيطة باستخدام شرط واحد وتصبح أكثر تعقيدًا كلما حفرت أعمق في البيانات المدمجة لجملة If-Else.

ما رأيك في عبارة If-Else؟ هل تعتقد أنك ستستخدمها أكثر بعد قراءة هذا المقال؟ ما هي الأغراض الأخرى التي يمكنك أن تفكر في تطبيق المعرفة التي اكتسبتها هنا؟

قراءة إضافية

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