ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

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

главление:

كائنات في بوويرشيل
عرض هيكل الكائنات
تصفية الكائن
فرز الكائنات
اختيار الأشياء وأجزائها
ForEach-Object و Group-Object و Measure Object
إنشاء كائنات .NET و COM (كائن جديد)
استدعاء طرق ثابتة
اكتب PSCustomObject
إنشاء الفصول الدراسية الخاصة بك

كائنات في بوويرشيل

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

عرض هيكل الكائنات

على سبيل المثال ، لنقم بتشغيل Get-Process cmdlet ، والذي يسمح لك بالحصول على معلومات حول العمليات الجارية في النظام:

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

سيعرض بعض البيانات النصية المنسقة التي لا تعطي فكرة عن خصائص الكائنات التي تم إرجاعها وطرقها. لضبط الإخراج ، تحتاج إلى معرفة كيفية فحص بنية الكائنات ، وسيساعدنا Get-Member cmdlet في هذا:

Get-Process | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

هنا نرى بالفعل النوع والهيكل ، وبمساعدة المعلمات الإضافية ، يمكننا ، على سبيل المثال ، عرض فقط خصائص الكائن الذي وصل إلى المدخلات:

Get-Process | Get-Member -MemberType Property

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

تصفية الكائن

يتيح لك PowerShell توجيه الكائنات التي تفي بشرط معين:

Where-Object { блок сценария }

يجب أن تكون نتيجة تنفيذ كتلة البرنامج النصي داخل أقواس المشغل قيمة منطقية. إذا كان هذا صحيحًا ($ true) ، فسيتم تمرير الكائن الذي تم إدخاله في إدخال Where-Object cmdlet على طول خط الأنابيب ، وإلا (القيمة $ false) فسيتم حذفه. على سبيل المثال ، دعنا نعرض قائمة بخدمات Windows Server المتوقفة ، أي أولئك الذين تم تعيين خاصية الحالة على "متوقف":

Get-Service | Where-Object {$_.Status -eq "Stopped"}

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

هنا مرة أخرى نرى تمثيلًا نصيًا ، ولكن إذا كنت تريد فهم النوع والهيكل الداخلي للكائنات التي تمر عبر خط الأنابيب ، فهذا ليس بالأمر الصعب:

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

فرز الكائنات

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

Get-Process | Sort-Object –Property cpu

يمكن حذف المعلمة -Property عند استدعاء الأمر Sort-Object cmdlet واستخدامها افتراضيًا. للفرز العكسي ، يتم استخدام المعلمة -Descending:

Get-Process | Sort-Object cpu -Descending

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

اختيار الأشياء وأجزائها

يسمح لك Select-Object cmdlet بتحديد عدد معين من الكائنات في بداية أو نهاية خط الأنابيب باستخدام الخيارين -First أو -Last. باستخدامه ، يمكنك تحديد كائنات فردية أو خصائص محددة ، وكذلك إنشاء كائنات جديدة بناءً عليها. دعنا نحلل عمل cmdlet باستخدام أمثلة بسيطة.

يعرض الأمر التالي معلومات حول العمليات العشر التي تستهلك الحد الأقصى لمقدار ذاكرة الوصول العشوائي (خاصية WS):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

يمكنك تحديد خصائص معينة فقط للكائنات التي تمر عبر خط الأنابيب وإنشاء خصائص جديدة بناءً عليها:

Get-Process | Select-Object ProcessName, Id -First 1

نتيجة لخط الأنابيب ، سنحصل على كائن جديد ، سيختلف هيكله عن الهيكل الذي يتم إرجاعه بواسطة Get-Process cmdlet. تحقق من ذلك مع Get-Member:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لاحظ أن Select-Object يُرجع كائنًا واحدًا (-First 1) يحتوي على الحقلين اللذين حددناهما فقط: تم نسخ قيمهما من الكائن الأول الذي تم تمريره إلى خط الأنابيب بواسطة Get-Process cmdlet. تعتمد إحدى طرق إنشاء كائنات في برامج PowerShell النصية على استخدام Select-Object:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

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

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لنلقِ نظرة على بنية الكائنات التي تمر عبر خط الأنابيب:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

ForEach-Object و Group-Object و Measure Object

هناك أوامر cmdlets أخرى للعمل مع الكائنات. على سبيل المثال ، دعنا نتحدث عن الثلاثة الأكثر فائدة:

لكل كائن يسمح لك بتنفيذ كود PowerShell لكل كائن في خط الأنابيب:

ForEach-Object { блок сценария }

مجموعة وجوه تجميع الكائنات حسب قيمة الخاصية:

Group-Object PropertyName

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

قياس الكائن لتجميع معلمات التلخيص المختلفة حسب قيم حقول الكائنات في خط الأنابيب (تحسب المجموع ، وتجد أيضًا القيمة الدنيا أو القصوى أو المتوسط):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

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

إنشاء كائنات .NET و COM (كائن جديد)

هناك العديد من مكونات البرامج مع واجهات .NET Core و COM المفيدة لمسؤولي النظام. باستخدام فئة System.Diagnostics.EventLog ، يمكنك إدارة سجلات النظام مباشرة من Windows PowerShell. لنلقِ نظرة على مثال لإنشاء مثيل من هذه الفئة باستخدام الأمر New-Object cmdlet مع المعلمة -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

نظرًا لأننا لم نحدد سجل أحداث معين ، فإن مثيل الفئة الناتج لا يحتوي على بيانات. لتغيير هذا ، تحتاج إلى استدعاء طريقة منشئ خاص أثناء إنشائها باستخدام المعلمة -ArgumentList. إذا أردنا الوصول إلى سجل التطبيق ، فيجب تمرير السلسلة "Application" إلى المُنشئ كوسيطة:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

يرجى ملاحظة أننا حفظنا إخراج الأمر في متغير AppLog $. على الرغم من استخدام خطوط الأنابيب بشكل شائع في الوضع التفاعلي ، إلا أن البرمجة النصية تتطلب غالبًا الاحتفاظ بمرجع إلى كائن. بالإضافة إلى ذلك ، يتم تضمين الفئات الأساسية لـ .NET Core في System: مساحة الاسم. يبحث PowerShell عن الأنواع المحددة فيه افتراضيًا ، لذا فإن كتابة Diagnostics.EventLog بدلاً من System.Diagnostics.EventLog أمر جيد.

للعمل مع السجل ، يمكنك الرجوع إلى الطرق المقابلة:

$AppLog | Get-Member -MemberType Method

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لنفترض أنه تم مسحه بواسطة طريقة Clear () إذا كانت هناك حقوق وصول:

$AppLog.Clear()

يُستخدم أمر cmdlet الجديد للكائن أيضًا للعمل مع مكونات COM. هناك عدد غير قليل منها ، من المكتبات التي تأتي مع Windows Script Server إلى تطبيقات ActiveX مثل Internet Explorer. لإنشاء كائن COM ، تحتاج إلى تحديد المعلمة -ComObject باستخدام ProgId البرمجي للفئة المطلوبة:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

لإنشاء كائنات خاصة بك بهيكل تعسفي ، فإن استخدام New-Object يبدو قديمًا ومرهقًا ، يتم استخدام أمر cmdlet هذا للعمل مع مكونات البرنامج الخارجية لـ PowerShell. ستعالج المقالات المستقبلية هذه القضية بمزيد من التفصيل. بالإضافة إلى كائنات .NET و COM ، سنستكشف أيضًا كائنات CIM (WMI) و ADSI.

استدعاء طرق ثابتة

لا يمكن إنشاء مثيل لبعض فئات .NET Core ، بما في ذلك System.Environment و System.Math. هم ثابتة وتحتوي فقط على خصائص وطرق ثابتة. في الأساس ، هذه مكتبات مرجعية تُستخدم بدون إنشاء كائنات. يمكنك الإشارة إلى فئة ثابتة كفئة حرفية بإحاطة اسم النوع بأقواس مربعة. في الوقت نفسه ، إذا نظرنا إلى بنية الكائن باستخدام Get-Member ، فسنرى نوع System.RuntimeType بدلاً من System.Environment:

[System.Environment] | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لعرض الأعضاء الساكنين فقط ، تحتاج إلى الاتصال بـ Get-Member باستخدام المعلمة -Static (انتبه إلى نوع الكائن):

[System.Environment] | Get-Member -Static

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

للوصول إلى الخصائص والطرق الثابتة ، يتم استخدام نقطتين متتاليتين بدلاً من نقطة بعد الحرف:

[System.Environment]::OSVersion

أو

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

اكتب PSCustomObject

من بين أنواع البيانات العديدة المتوفرة في PowerShell ، تجدر الإشارة إلى PSCustomObject ، المصمم لتخزين الكائنات بهيكل عشوائي. يعتبر إنشاء مثل هذا الكائن باستخدام أمر cmdlet الجديد للكائن طريقة كلاسيكية ولكنها مرهقة وعفا عليها الزمن:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

دعونا نلقي نظرة على هيكل الكائن:

$object | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

بدءًا من PowerShell 3.0 ، يتوفر بناء جملة آخر:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

يمكنك الوصول إلى البيانات بإحدى الطرق المكافئة:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

فيما يلي مثال على تحويل علامة التجزئة الموجودة إلى كائن:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

من عيوب الكائنات من هذا النوع أن ترتيب خصائصها يمكن أن يتغير. لتجنب ذلك ، تحتاج إلى استخدام السمة [المطلوبة]:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

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

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

يسمح لك الأمر cmdlet للأعضاء بإضافة خصائص ليس فقط ، ولكن أيضًا أساليب إلى كائن $ تم إنشاؤه مسبقًا باستخدام بنية "-MemberType ScriptMethod":

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

لاحظ أننا استخدمنا متغير $ ScriptBlock من نوع ScriptBlock لتخزين الكود الخاص بالطريقة الجديدة.

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لإزالة الخصائص ، استخدم الطريقة المقابلة:

$object.psobject.properties.remove('Name')

إنشاء الفصول الدراسية الخاصة بك

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

class MyClass
{
    # тело класса
}

هذا هو نوع NET Core حقيقي ، ويصف هيكله خصائصه وطرقه وعناصره الأخرى. ضع في اعتبارك مثالًا لتعريف فئة بسيط:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

لإنشاء كائن (مثيل لفئة) ، استخدم الأمر cmdlet كائن جديد، أو حرفي من النوع [MyClass] و طريقة الكاذبة جديد (مُنشئ افتراضي):

$object = New-Object -TypeName MyClass

أو

$object = [MyClass]::new()

دعنا نحلل بنية الكائن:

$object | Get-Member

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

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

بعد إنشاء الكائن ، املأ خصائصه:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

لاحظ أنه في وصف الفئة ، لم يتم تحديد أنواع الخصائص فقط ، ولكن أيضًا قيمها الافتراضية:

class Example
{
     [string]$Name = 'John Doe'
}

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

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

الآن ممثل صفنا يعرف كيف يبتسم:

$object = [MyClass]::new()
$object.Smile($true)

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

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

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

الجزء 1: الميزات الرئيسية لبرنامج Windows PowerShell
الجزء 2: مقدمة إلى لغة برمجة Windows PowerShell
الجزء 3: تمرير المعلمات إلى البرامج النصية والوظائف ، وإنشاء أوامر cmdlets

ما هو Windows PowerShell وماذا يتم تناوله؟ الجزء 4: العمل مع الكائنات والفصول الخاصة

المصدر: www.habr.com

إضافة تعليق