ما هو Windows PowerShell وماذا يأكل؟ الجزء الثاني: مقدمة في لغة البرمجة

تاريخيا ، تم تطوير الأدوات المساعدة لسطر الأوامر على أنظمة Unix بشكل أفضل من Windows ، ولكن مع ظهور حل جديد ، تغير الوضع.



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

جدول المحتويات:


التعليقات
المتغيرات وأنواعها
متغيرات النظام
النطاقات المتغيرات
البيئية (
الحساب )
عوامل الحساب والمقارنة عوامل التعيين
عوامل التشغيل المنطقية
الانتقال الشرطي
حلقات
الصفائف
جداول التجزئة
وظائف
معالجة الأخطاء يمكنك

كتابة التعليمات البرمجية في أي محرر نصوص أو استخدام بيئة التطوير المتكاملة - أسهل طريقة لاتخاذها تم تضمين Windows PowerShell ISE في أنظمة تشغيل Microsoft Server. هذا ضروري فقط للنصوص المعقدة إلى حد ما: من السهل تنفيذ مجموعات قصيرة من الأوامر بشكل تفاعلي.

تعليقات


يعتبر استخدام التعليقات جزءًا من نمط البرمجة الجيد جنبًا إلى جنب مع المسافات البادئة والمسافات المناسبة:

#       —     .

<# 

             . 
            .

#>

المتغيرات وأنواعها


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

صورة

لتهيئة المتغير (تعيين قيمة له) ، يتم استخدام عامل التعيين (الرمز =):

$test = 100

يمكنك تعريف متغير بتحديد نوعه بين قوسين معقوفين (نوع عامل التحويل) قبل الاسم أو القيمة:

[int]$test = 100

$test = [int]100

من المهم أن نفهم أن المتغيرات في PowerShell هي كائنات كاملة (فئات) ذات خصائص وأساليب تعتمد أنواعها على تلك المتوفرة في .NET Core. ندرج أهمها:
النوع (فئة .NET)
وصف
مثال على الرمز
[string]
System.String
Unicode 
$test = «»
$test = ''
[char]
System.Char
Unicode (16 )
[char]$test = 'c'
[bool]
System.Boolean
( True False)
[bool]$test = $true
[int]
System.Int32
(32 )
[int]$test = 123456789
[long]
System.Int64
(64 )
[long]$test = 12345678910
[single]
System.Single
32
[single]$test = 12345.6789
[double]
System.Double
64 (8 )
[double]$test = 123456789.101112
[decimal]
System.Decimal
رقم فاصلة عائمة 128 بت (تأكد من تضمين d في النهاية)
[عشري] $ test = 12345.6789d
[DateTime]
System.DateTime
التاريخ و الوقت 
اختبار $ = Get-Date
[المصفوفة] النظام.
الكائن []
صفيف يبدأ مؤشر عنصره عند 0
$ test_array = 1، 2، "test"، 3، 4
[هاشتابل]
System.Collections.Hashtable
جداول التجزئة - المصفوفات الترابطية بمفاتيح مسماة ، مبنية على المبدأ: @ {key = "value"}
$ test_hashtable = @ {one = "one"؛ اثنان = "اثنان" ؛ ثلاثة = "ثلاثة"}

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

$test.GetType().FullName

صورة

هناك عدد من أوامر cmdlets لإدارة المتغيرات. يتم عرض قائمتهم في شكل ملائم باستخدام الأمر:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

صورة

لعرض المتغيرات المعلنة وقيمها ، يمكنك استخدام الأمر cmdlet الخاص:

Get-Variable | more

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

متغيرات النظام


بالإضافة إلى تلك التي أعلن عنها المستخدم ، هناك متغيرات (نظام) مدمجة لا يتم حذفها بعد نهاية الجلسة الحالية. يتم تقسيمها إلى نوعين ، بينما يتم تخزين بيانات حالة PowerShell في متغيرات تلقائية ، والتي لا يمكن تعيين قيم عشوائية من تلقاء نفسها. وهي تشمل ، على سبيل المثال ، $ PWD:

$PWD.Path

صورة

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

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

Get-ChildItem Variable: | more

أو

ls Variable: | more

صورة

نطاقات


بالنسبة للمتغيرات في PowerShell ، هناك فكرة النطاق. يمتد عمل المنطقة العالمية (العالمية) إلى الجلسة الحالية بأكملها - فهو يشمل ، على سبيل المثال ، متغيرات النظام. المتغيرات المحلية متاحة فقط في المنطقة التي تم تعريفها فيها: دعنا نقول داخل الدالة. هناك أيضًا مفهوم نطاق البرنامج النصي ، ولكن بالنسبة لأوامر البرنامج النصي ، فهو محلي بشكل أساسي. بشكل افتراضي ، عند تعريف المتغيرات ، يتم منحها نطاقًا محليًا ، ولتغيير هذا ، نحتاج إلى بناء خاص للنموذج: $ Global: variable = value.

على سبيل المثال ، مثل هذا:

$Global:test = 100

متغيرات البيئة


يتوفر محرك أقراص زائف آخر لـ Env من PowerShell ، والذي يمكن استخدامه للوصول إلى متغيرات البيئة. عندما تبدأ الصدفة ، يتم نسخها من العملية الرئيسية (أي من البرنامج الذي بدأ الجلسة الحالية) وعادة ما تتزامن قيمها الأولية مع القيم الموجودة في لوحة التحكم. لعرض متغيرات البيئة ، استخدم Get-ChildItem cmdlet أو الأسماء المستعارة (liases): ls و dir.

dir Env:

صورة

هذه المتغيرات عبارة عن تسلسل من وحدات البايت (أو الأحرف ، إذا أردت) ، والتي يعتمد تفسيرها فقط على البرنامج الذي يستخدمها. * - لا تعمل أوامر cmdlets المتغيرة مع متغيرات البيئة. للوصول إليها ، يجب عليك استخدام بادئة القرص:

$env:TEST = "Hello, World!"

صورة

عوامل الحساب والمقارنة


لدى PowerShell العوامل الحسابية التالية: + (الجمع) ، - (الطرح) ، * (الضرب) ، / (القسمة) و٪ (الوحدة النمطية أو باقي القسمة). يتم حساب نتيجة التعبير الحسابي من اليسار إلى اليمين وفقًا لترتيب العمليات المقبولة بشكل عام ، ويتم استخدام الأقواس لتجميع أجزاء من التعبير. يتم تجاهل المسافات بين عوامل التشغيل ، يتم استخدامها فقط لتسهيل الإدراك. يتسلسل عامل التشغيل + أيضًا ، ويكرر عامل التشغيل * الخطوط. إذا حاولت إضافة رقم إلى سلسلة ، سيتم تحويله إلى سلسلة. بالإضافة إلى ذلك ، يحتوي PowerShell على العديد من عوامل المقارنة التي تتحقق من التوافق بين قيمتين وإرجاع منطقي صحيح أو خطأ:
المشغل أو العامل
وصف
مثال على الرمز
-عادل
يساوي (تناظري = أو == بلغات أخرى)
$ test = 100
$ test -eq 123 
-نعم
لا يساوي (تناظري <> أو! =)
$ test = 100
$ test -ne 123   
-gt
أكبر من / أكثر (تناظري>)
$ test = 100
$ test -gt 123
-ge
أكبر من أو يساوي / أكبر من أو يساوي (تناظري> =)
$ test = 100
$ test -ge 123
-لا
أقل من (تناظري <)
$ test = 100
$ test -lt 123  
-le
أقل من أو يساوي / أقل من أو يساوي (تناظري <=)
$ test = 100
$ test -le 123

هناك عوامل تشغيل أخرى مماثلة تسمح ، على سبيل المثال ، بمقارنة السلاسل بحرف البدل أو باستخدام التعبيرات العادية لمطابقة الأنماط. سننظر فيها بالتفصيل في المقالات التالية. لا يتم استخدام الرموز <و> و = للمقارنة ، حيث يتم استخدامها لأغراض أخرى.

عوامل الاحالة


بالإضافة إلى عامل التشغيل الأكثر شيوعًا = ، هناك عوامل تعيين أخرى: + = ، - = ، * = ، / = و٪ =. يغيرون القيمة قبل المهمة. العاملان الأحاديان ++ و - يتصرفان بالمثل ، مما يزيد أو ينقص قيمة المتغير - يتعلقان أيضًا بعوامل التخصيص.

العوامل المنطقية


المقارنة ليست كافية لوصف الظروف الصعبة. يمكنك تدوين أي تعبيرات منطقية باستخدام العوامل التالية: - و - أو - أو - xor ، - لا و! .. وهي تعمل كما هو الحال في لغات البرمجة الأخرى ، بينما يمكنك استخدام الأقواس لتحديد ترتيب الحساب:

("" -eq "") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

قفزة مشروطة


عوامل التشغيل المتفرعة في PowerShell هي المعيار: IF (IF ... ELSE، IF ... ELSEIF ... ELSE) و SWITCH. فكر في استخدامها مع الأمثلة:

[int]$test = 100
if ($test -eq 100) {
      Write-Host "test = 100"
}



[int]$test = 50
if ($test -eq 100) {
       Write-Host "test = 100"
}
else {
      Write-Host "test <> 100"
}



[int]$test = 10
if ($test -eq 100) {
      Write-Host "test = 100"
}
elseif ($test -gt 100) {
      Write-Host "test > 100"
}
else {
       Write-Host "test < 100"
}



[int]$test = 5
switch ($test) {
     0 {Write-Host "test = 0"}
     1 {Write-Host "test = 1"}
     2 {Write-Host "test = 2"}
     3 {Write-Host "test = 3"}
     4 {Write-Host "test = 4"}
     5 {Write-Host "test = 5"}
     default {Write-Host "test > 5    "}
}

دورات


هناك عدة أنواع من الحلقات في PowerShell: WHILE و DO WHILE و DO UNTIL و FOR و FOREACH.

تعمل حلقة الشرط المسبق إذا / أثناء تشغيلها:

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

ستعمل الحلقات ذات الحالة اللاحقة مرة واحدة على الأقل ، لأنه يتم التحقق من الحالة بعد التكرار. في هذه الحالة ، يعمل WH WHILE عندما يكون الشرط صحيحًا ، وافعله حتى - بينما هو خطأ:

[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
while ($test -lt 10)



[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
until ($test -gt 9)


عدد التكرارات للحلقة FOR معروف مسبقًا:

for ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}


في حلقة FOREACH يتكرر على عناصر مصفوفة أو مجموعة (جدول التجزئة):

$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
        Write-Host $item
}

المصفوفات


لا تقوم متغيرات PowerShell بتخزين الكائنات الفردية فقط (العدد ، السلسلة ، إلخ) ، ولكن أيضًا الجمع. أبسط مجموعة من هذه المتغيرات هي المصفوفات. يمكن أن يتكون الصفيف من عدة عناصر ، عنصر واحد أو أن يكون فارغًا ، أي لا تحتوي على عناصر. للإعلان عن ذلك ، استخدم عامل التشغيل @ () ، الذي سنحتاجه في المقالة التالية - من المهم جدًا إضافة صفائف أخرى إلى الصفيف (إنشاء صفائف متعددة الأبعاد) ، وتمرير المصفوفات إلى الدوال كوسيطة ، ومهام مماثلة:

$test_array = @() #  

عند تهيئة الصفيف ، يتم سرد قيمه بفاصلة (عامل تشغيل خاص):

$test_array = @(1, 2, 3, 4) #      

في معظم الحالات ، يمكن حذف عامل التشغيل @ ():

$test_array = 1, 2, 3, 4

في هذه الحالة ، تتم تهيئة مصفوفة من عنصر واحد على النحو التالي

$test_array = , 1

للوصول إلى عناصر الصفيف ، يتم استخدام فهرس صحيح يبدأ من الصفر وعامل الفهرس (أقواس مربعة):

$test_array[0] = 1

يمكنك تحديد فهارس متعددة ، مفصولة بفواصل ، بما في ذلك مكرر:

$test_array = "", "", "", ""
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

صورة

عامل التشغيل ..(نقطتان - عامل النطاق) يقوم بإرجاع مجموعة من الأعداد الصحيحة على قطعة محددة بواسطة الحدود العليا والسفلى. على سبيل المثال ، يعرض التعبير 1..4 صفيفًا من أربعة عناصر @ (1 ، 2 ، 3 ، 4) ، ويعرض التعبير 8..5 صفيف @ (8 ، 7 ، 6 ، 5).

صورة

باستخدام عامل تشغيل النطاق ، يمكنك تهيئة مصفوفة ($ test_array = 1..4) أو الحصول على شريحة ، أي سلسلة من العناصر في صفيف واحد مع مؤشرات من أخرى. في هذه الحالة ، يشير الرقم السالب -1 إلى العنصر الأخير للصفيف ، -2 - قبل الأخير ، إلخ.

$test_array = "", "", "", ""
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

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

$test_array[0..100]

إذا حاولت الوصول إلى عنصر صفيف واحد غير موجود ، فسيتم إرجاع $ null.

صورة

في PowerShell ، يمكن أن تحتوي المصفوفات على عناصر من أنواع مختلفة أو يمكن كتابتها بقوة:

$test_array = 1, 2, "", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
          Write-Host $test_array[$i]
}

حيث إن الخاصية $ test_array.count هي عدد العناصر في المصفوفة.

مثال على إنشاء مصفوفة مكتوبة بقوة:

[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

جداول التجزئة


نوع أساسي آخر من المتغيرات في PowerShell هو جداول التجزئة ، وتسمى أيضًا المصفوفات الترابطية. يشبه Hashtable كائن JSON ويتم إنشاؤه على أساس القيمة الأساسية. على عكس المصفوفات العادية ، يتم الوصول إلى عناصرها باستخدام مفاتيح مسماة ، وهي خصائص كائن (يمكنك أيضًا استخدام عامل تشغيل الفهرس - الأقواس المربعة).

يتم التصريح عن جدول تجزئة فارغ باستخدام رمز الخدمة @ وأقواس عامل التشغيل:

$test_hashtable = @{}

عند الإعلان ، يمكنك على الفور إنشاء مفاتيح وتعيين قيم لها:

$test_hashtable = @{one=""; two=""; three=""; "some key"="some value"}

لإضافة عنصر إلى جدول التجزئة ، يجب تعيين مفتاح غير موجود أو استخدام طريقة Add (). إذا تم التعيين بمفتاح موجود ، ستتغير قيمته. لإزالة عنصر من جدول التجزئة ، استخدم الأسلوب Remove ().

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "")
$test_hashtable.five = ""
$test_hashtable['five'] = " "
$test_hashtable.Remove("one")

صورة

يمكن تمرير المتغيرات من هذا النوع كوسيطات للدوال و cmdlets - في المقالة التالية سنتعلم كيفية القيام بذلك ، وننظر أيضًا في نوع آخر مماثل - PSCustomObject.

المهام


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

function - (1, ..., N) 
{ 
        - 
} 

تُرجع الدالة دائمًا النتيجة - وهي مجموعة من نتائج جميع عباراتها ، إذا كان هناك أكثر من نتيجة. إذا كان هناك عبارة واحدة ، يتم إرجاع قيمة واحدة من النوع المطابق. يضيف بناء القيمة $ return عنصرًا بالقيمة $ value إلى مصفوفة النتائج ويجهض قائمة العبارات ، وتُرجع الدالة الفارغة $ null.

على سبيل المثال ، قم بإنشاء دالة لتربيع رقم:

function sqr ($number)
{
      return $number * $number
}

لاحظ أنه في نص الوظيفة ، يمكنك استخدام أي متغيرات تم الإعلان عنها قبل الاستدعاء ، وقد تبدو وظائف الاستدعاء في PowerShell غير عادية: لا يتم تضمين الوسيطات (إن وجدت) بين قوسين ويتم فصلها بمسافات.

sqr 2

أو هكذا:

sqr -number 2

نظرًا للطريقة التي يتم بها تمرير الوسيطات ، يجب أحيانًا تضمين الدالة نفسها بين قوسين:

function test_func ($n) {}
test_func -eq $null     #   
(test_func) -eq $null   #   — $true

صورة

عند وصف دالة ، يمكنك تعيين قيم افتراضية للحجج:

function func ($arg = value) {
         # 
}

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

معالجة الخطأ


يحتوي PowerShell على آلية Try ... Catch ... وأخيرًا للتعامل مع الاستثناءات. تحتوي كتلة المحاولة على رمز قد يحدث فيه خطأ ، وتحتوي كتلة الصيد على معالجها. إذا لم يكن هناك خطأ ، فلن يتم تنفيذه. يتم تنفيذ الكتلة أخيرًا بعد كتلة المحاولة ، بغض النظر عن حدوث خطأ ، وقد يكون هناك العديد من كتل الصيد للاستثناءات من أنواع مختلفة. تتم كتابة الاستثناء نفسه إلى المتغير الافتراضي غير الإعلاني ($ _) ويمكن استرداده بسهولة. في المثال أدناه ، نقوم بتنفيذ الحماية ضد إدخال قيمة غير صحيحة:

try {

        [int]$test = Read-Host " "
        100 / $test

} catch {

         Write-Warning " "
         Write-Host $_

}

صورة

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

الجزء 1: الميزات الرئيسية لـ Windows PowerShell
الجزء 3: تمرير المعلمات إلى البرامج النصية والوظائف ، وإنشاء أوامر cmdlets
الجزء 4: العمل مع الكائنات والفئات المخصصة



All Articles