يعد إخراج النص للأوامر في نافذة مترجم PowerShell مجرد طريقة لعرض المعلومات في نموذج يمكن للبشر قراءته. في الواقع الأربعاء
главление:
كائنات في بوويرشيل
تذكر أن الكائن هو مجموعة من حقول البيانات (خصائص ، أحداث ، إلخ) وطرق معالجتها (طرق). يتم تحديد هيكلها حسب النوع ، والذي يعتمد عادةً على الفئات المستخدمة في النظام الأساسي الموحد لـ .NET Core. من الممكن أيضًا العمل مع كائنات COM و CIM (WMI) و ADSI. هناك حاجة إلى الخصائص والأساليب لتنفيذ إجراءات متنوعة على البيانات ، بالإضافة إلى ذلك ، في PowerShell ، يمكن تمرير الكائنات كوسائط للوظائف وأوامر cmdlets ، وتعيين قيمها إلى المتغيرات ، وهناك أيضًا
عرض هيكل الكائنات
على سبيل المثال ، لنقم بتشغيل Get-Process cmdlet ، والذي يسمح لك بالحصول على معلومات حول العمليات الجارية في النظام:
سيعرض بعض البيانات النصية المنسقة التي لا تعطي فكرة عن خصائص الكائنات التي تم إرجاعها وطرقها. لضبط الإخراج ، تحتاج إلى معرفة كيفية فحص بنية الكائنات ، وسيساعدنا Get-Member cmdlet في هذا:
Get-Process | Get-Member
هنا نرى بالفعل النوع والهيكل ، وبمساعدة المعلمات الإضافية ، يمكننا ، على سبيل المثال ، عرض فقط خصائص الكائن الذي وصل إلى المدخلات:
Get-Process | Get-Member -MemberType Property
ستحتاج إلى هذه المعرفة لحل المهام الإدارية بشكل تفاعلي أو لكتابة البرامج النصية الخاصة بك: على سبيل المثال ، للحصول على معلومات حول العمليات المعلقة بواسطة خاصية الاستجابة.
تصفية الكائن
يتيح لك PowerShell توجيه الكائنات التي تفي بشرط معين:
Where-Object { блок сценария }
يجب أن تكون نتيجة تنفيذ كتلة البرنامج النصي داخل أقواس المشغل قيمة منطقية. إذا كان هذا صحيحًا ($ true) ، فسيتم تمرير الكائن الذي تم إدخاله في إدخال Where-Object cmdlet على طول خط الأنابيب ، وإلا (القيمة $ false) فسيتم حذفه. على سبيل المثال ، دعنا نعرض قائمة بخدمات Windows Server المتوقفة ، أي أولئك الذين تم تعيين خاصية الحالة على "متوقف":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
هنا مرة أخرى نرى تمثيلًا نصيًا ، ولكن إذا كنت تريد فهم النوع والهيكل الداخلي للكائنات التي تمر عبر خط الأنابيب ، فهذا ليس بالأمر الصعب:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
فرز الكائنات
عندما يتم ربط الأشياء بالأنابيب ، غالبًا ما يكون من الضروري فرزها. يتم تمرير الأمر Sort-Object cmdlet بأسماء الخصائص (مفاتيح الفرز) وإرجاع الكائنات مرتبة حسب قيمها. يمكن فرز ناتج العمليات الجارية بسهولة حسب الوقت الذي تستغرقه وحدة المعالجة المركزية (خاصية وحدة المعالجة المركزية):
Get-Process | Sort-Object –Property cpu
يمكن حذف المعلمة -Property عند استدعاء الأمر Sort-Object cmdlet واستخدامها افتراضيًا. للفرز العكسي ، يتم استخدام المعلمة -Descending:
Get-Process | Sort-Object cpu -Descending
اختيار الأشياء وأجزائها
يسمح لك Select-Object cmdlet بتحديد عدد معين من الكائنات في بداية أو نهاية خط الأنابيب باستخدام الخيارين -First أو -Last. باستخدامه ، يمكنك تحديد كائنات فردية أو خصائص محددة ، وكذلك إنشاء كائنات جديدة بناءً عليها. دعنا نحلل عمل cmdlet باستخدام أمثلة بسيطة.
يعرض الأمر التالي معلومات حول العمليات العشر التي تستهلك الحد الأقصى لمقدار ذاكرة الوصول العشوائي (خاصية WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
يمكنك تحديد خصائص معينة فقط للكائنات التي تمر عبر خط الأنابيب وإنشاء خصائص جديدة بناءً عليها:
Get-Process | Select-Object ProcessName, Id -First 1
نتيجة لخط الأنابيب ، سنحصل على كائن جديد ، سيختلف هيكله عن الهيكل الذي يتم إرجاعه بواسطة Get-Process cmdlet. تحقق من ذلك مع Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
لاحظ أن Select-Object يُرجع كائنًا واحدًا (-First 1) يحتوي على الحقلين اللذين حددناهما فقط: تم نسخ قيمهما من الكائن الأول الذي تم تمريره إلى خط الأنابيب بواسطة Get-Process cmdlet. تعتمد إحدى طرق إنشاء كائنات في برامج PowerShell النصية على استخدام Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
باستخدام Select-Object ، يمكنك إضافة خصائص محسوبة إلى الكائنات التي تريد تمثيلها على هيئة
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
لنلقِ نظرة على بنية الكائنات التي تمر عبر خط الأنابيب:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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
نظرًا لأننا لم نحدد سجل أحداث معين ، فإن مثيل الفئة الناتج لا يحتوي على بيانات. لتغيير هذا ، تحتاج إلى استدعاء طريقة منشئ خاص أثناء إنشائها باستخدام المعلمة -ArgumentList. إذا أردنا الوصول إلى سجل التطبيق ، فيجب تمرير السلسلة "Application" إلى المُنشئ كوسيطة:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
يرجى ملاحظة أننا حفظنا إخراج الأمر في متغير AppLog $. على الرغم من استخدام خطوط الأنابيب بشكل شائع في الوضع التفاعلي ، إلا أن البرمجة النصية تتطلب غالبًا الاحتفاظ بمرجع إلى كائن. بالإضافة إلى ذلك ، يتم تضمين الفئات الأساسية لـ .NET Core في System: مساحة الاسم. يبحث PowerShell عن الأنواع المحددة فيه افتراضيًا ، لذا فإن كتابة Diagnostics.EventLog بدلاً من System.Diagnostics.EventLog أمر جيد.
للعمل مع السجل ، يمكنك الرجوع إلى الطرق المقابلة:
$AppLog | Get-Member -MemberType Method
لنفترض أنه تم مسحه بواسطة طريقة 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. هم
[System.Environment] | Get-Member
لعرض الأعضاء الساكنين فقط ، تحتاج إلى الاتصال بـ Get-Member باستخدام المعلمة -Static (انتبه إلى نوع الكائن):
[System.Environment] | Get-Member -Static
للوصول إلى الخصائص والطرق الثابتة ، يتم استخدام نقطتين متتاليتين بدلاً من نقطة بعد الحرف:
[System.Environment]::OSVersion
أو
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
اكتب PSCustomObject
من بين أنواع البيانات العديدة المتوفرة في PowerShell ، تجدر الإشارة إلى PSCustomObject ، المصمم لتخزين الكائنات بهيكل عشوائي. يعتبر إنشاء مثل هذا الكائن باستخدام أمر cmdlet الجديد للكائن طريقة كلاسيكية ولكنها مرهقة وعفا عليها الزمن:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
دعونا نلقي نظرة على هيكل الكائن:
$object | Get-Member
بدءًا من 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()
من عيوب الكائنات من هذا النوع أن ترتيب خصائصها يمكن أن يتغير. لتجنب ذلك ، تحتاج إلى استخدام السمة [المطلوبة]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
هناك خيارات أخرى لإنشاء كائن: أعلاه ، نظرنا في استخدام الأمر cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
يسمح لك الأمر cmdlet للأعضاء بإضافة خصائص ليس فقط ، ولكن أيضًا أساليب إلى كائن $ تم إنشاؤه مسبقًا باستخدام بنية "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
لاحظ أننا استخدمنا متغير $ ScriptBlock من نوع ScriptBlock لتخزين الكود الخاص بالطريقة الجديدة.
لإزالة الخصائص ، استخدم الطريقة المقابلة:
$object.psobject.properties.remove('Name')
إنشاء الفصول الدراسية الخاصة بك
قدم PowerShell 5.0 القدرة على التحديد
class MyClass
{
# тело класса
}
هذا هو نوع NET Core حقيقي ، ويصف هيكله خصائصه وطرقه وعناصره الأخرى. ضع في اعتبارك مثالًا لتعريف فئة بسيط:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
لإنشاء كائن (مثيل لفئة) ، استخدم الأمر cmdlet
$object = New-Object -TypeName MyClass
أو
$object = [MyClass]::new()
دعنا نحلل بنية الكائن:
$object | Get-Member
لا تنس النطاق: لا يمكنك الإشارة إلى اسم النوع كسلسلة أو استخدام نوع حرفي خارج البرنامج النصي أو الوحدة النمطية التي يتم تعريف الفئة بها. في الوقت نفسه ، يمكن للوظائف إرجاع مثيلات الفئة (الكائنات) التي ستكون متاحة خارج الوحدة النمطية أو البرنامج النصي.
بعد إنشاء الكائن ، املأ خصائصه:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
لاحظ أنه في وصف الفئة ، لم يتم تحديد أنواع الخصائص فقط ، ولكن أيضًا قيمها الافتراضية:
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)
يمكن تحميل الطرق بشكل زائد ، بالإضافة إلى أن الفصل يحتوي على
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
وصفنا للعمل مع الكائنات في PowerShell بالكاد شامل. في المنشورات التالية ، سنحاول تعميقها بأمثلة عملية: سيتم تخصيص المقالة الخامسة من السلسلة لتكامل PowerShell مع مكونات برامج الجهات الخارجية. يمكن العثور على الأجزاء السابقة على الروابط أدناه.
المصدر: www.habr.com