Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

خروجی متن دستورات در پنجره مفسر PowerShell تنها راهی برای نمایش اطلاعات به شکلی مناسب برای درک انسان است. در واقع چهارشنبه جهت دار برای کار با اشیاء: cmdlet ها و توابع آنها را به عنوان ورودی دریافت می کنند و در خروجی برگشت، و انواع متغیرهای موجود به صورت تعاملی و در اسکریپت بر اساس کلاس های دات نت هستند. در چهارمین مقاله از مجموعه کار با اجسام را با جزئیات بیشتری بررسی خواهیم کرد.

شرح:

اشیاء در PowerShell
مشاهده ساختار اشیا
فیلتر کردن اشیاء
مرتب سازی اشیاء
انتخاب اشیا و قطعات آنها
ForEach-Object، Group-Object و Measure-Object
ایجاد اشیاء .NET و COM (New-Object)
فراخوانی روش های استاتیک
PSCustomObject را تایپ کنید
ایجاد کلاس های خود

اشیاء در PowerShell

به یاد بیاوریم که یک شی مجموعه ای از فیلدهای داده (ویژگی ها، رویدادها و غیره) و روش هایی برای پردازش آنها (روش ها) است. ساختار آن توسط یک نوع مشخص می شود که معمولاً بر اساس کلاس های مورد استفاده در پلت فرم یکپارچه NET Core است. همچنین امکان کار با اشیاء COM، CIM (WMI) و ADSI وجود دارد. برای انجام اقدامات مختلف روی داده ها به ویژگی ها و متدهایی نیاز است؛ علاوه بر این، در PowerShell، اشیاء را می توان به عنوان آرگومان به توابع و cmdlet ها منتقل کرد، مقادیر آنها را به متغیرها اختصاص داد و همچنین وجود دارد. مکانیسم ترکیب فرمان (نقاله یا خط لوله). هر فرمان در خط لوله خروجی خود را به نوبه خود، شی به شیء به فرمان بعدی ارسال می کند. برای پردازش، می توانید از cmdlet های کامپایل شده استفاده کنید یا خودتان ایجاد کنید خصوصیات پیشرفتهبرای انجام دستکاری های مختلف با اشیاء در خط لوله: فیلتر کردن، مرتب سازی، گروه بندی و حتی تغییر ساختار آنها. انتقال داده ها به این شکل یک مزیت جدی دارد: تیم دریافت کننده نیازی به تجزیه جریان بایت (متن) ندارد، تمام اطلاعات لازم به راحتی با فراخوانی خواص و روش های مناسب بازیابی می شود.

مشاهده ساختار اشیا

به عنوان مثال، بیایید cmdlet Get-Process را اجرا کنیم، که به شما امکان می دهد اطلاعاتی در مورد فرآیندهای در حال اجرا در سیستم به دست آورید:

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

برخی از داده های متنی قالب بندی شده را نمایش می دهد که هیچ ایده ای در مورد ویژگی های اشیاء برگشتی و روش های آنها نمی دهد. برای تنظیم دقیق خروجی، باید یاد بگیریم که چگونه ساختار اشیا را بررسی کنیم و cmdlet Get-Member در این مورد به ما کمک می کند:

Get-Process | Get-Member

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

در اینجا ما قبلاً نوع و ساختار را می بینیم و با کمک پارامترهای اضافی می توانیم برای مثال فقط ویژگی های شی موجود در ورودی را نمایش دهیم:

Get-Process | Get-Member -MemberType Property

این دانش برای حل مشکلات مدیریت به صورت تعاملی یا نوشتن اسکریپت های خود مورد نیاز است: به عنوان مثال، برای به دست آوردن اطلاعات در مورد فرآیندهای آویزان با استفاده از ویژگی Responding.

فیلتر کردن اشیاء

PowerShell اجازه می دهد تا اشیایی که شرایط خاصی را دارند از طریق خط لوله عبور کنند:

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

نتیجه اجرای بلوک اسکریپت در داخل پرانتز باید یک مقدار بولی باشد. اگر درست باشد ($true)، شیئی که به cmdlet Where-Object وارد می شود در امتداد خط لوله ارسال می شود، در غیر این صورت ($false) حذف می شود. به عنوان مثال، بیایید لیستی از سرویس های ویندوز سرور متوقف شده را نمایش دهیم، i.e. کسانی که ویژگی Status آنها روی "Stopped" تنظیم شده است:

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

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

در اینجا دوباره یک نمایش متنی می بینیم، اما اگر می خواهید نوع و ساختار داخلی اشیایی که از خط لوله عبور می کنند را درک کنید، دشوار نیست:

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

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

مرتب سازی اشیاء

هنگام پردازش خط لوله اشیاء، اغلب نیاز به مرتب سازی آنها وجود دارد. به cmdlet Sort-Object نام خصوصیات (کلیدهای مرتب‌سازی) ارسال می‌شود و اشیاء مرتب شده بر اساس مقادیرشان را برمی‌گرداند. به راحتی می توان خروجی فرآیندهای در حال اجرا را بر اساس زمان صرف شده CPU (ویژگی cpu) مرتب کرد:

Get-Process | Sort-Object –Property cpu

هنگام فراخوانی Sort-Object cmdlet، پارامتر -Property را می توان حذف کرد؛ این پارامتر به طور پیش فرض استفاده می شود. برای مرتب سازی معکوس، از پارامتر -نزولی استفاده کنید:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

انتخاب اشیا و قطعات آنها

cmdlet Select-Object به شما این امکان را می دهد که با استفاده از پارامترهای -First یا -Last تعداد خاصی از اشیاء را در ابتدا یا انتهای خط لوله انتخاب کنید. با کمک آن می توانید اشیاء منفرد یا خصوصیات خاصی را انتخاب کنید و همچنین بر اساس آنها اشیاء جدیدی ایجاد کنید. بیایید به نحوه کار cmdlet با استفاده از مثال های ساده نگاه کنیم.

دستور زیر اطلاعاتی را در مورد 10 فرآیندی که حداکثر مقدار RAM را مصرف می کنند (ویژگی WS) نمایش می دهد:

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

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

شما می توانید فقط ویژگی های خاصی از اشیاء عبوری از خط لوله را انتخاب کنید و بر اساس آنها موارد جدیدی ایجاد کنید:

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

در نتیجه عملیات خط لوله، یک شی جدید دریافت خواهیم کرد که ساختار آن با ساختاری که توسط cmdlet Get-Process برگردانده شده متفاوت است. بیایید این را با استفاده از Get-Member تأیید کنیم:

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

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

توجه داشته باشید که Select-Object یک شی منفرد (-First 1) را برمی‌گرداند که فقط دو مورد از فیلدهایی را که ما مشخص کردیم دارد: مقادیر آنها از اولین شیء ارسال شده به خط لوله توسط cmdlet Get-Process کپی شده است. یکی از راه های ایجاد اشیاء در اسکریپت های 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

cmdlet های دیگری برای کار با اشیا وجود دارد. به عنوان مثال، بیایید در مورد سه مورد مفید صحبت کنیم:

ForEach-object به شما امکان می دهد کد PowerShell را برای هر شی در خط لوله اجرا کنید:

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

Group-Object اشیاء را بر اساس مقدار ویژگی گروه بندی می کند:

Group-Object PropertyName

اگر آن را با پارامتر -NoElement اجرا کنید، می توانید تعداد عناصر گروه ها را دریابید.

Measure-Object پارامترهای خلاصه مختلف را بر اساس مقادیر فیلد شی در خط لوله جمع می کند (مجموع را محاسبه می کند و همچنین مقدار حداقل، حداکثر یا میانگین را پیدا می کند):

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

به طور معمول، cmdlet های مورد بحث به صورت تعاملی استفاده می شوند و اغلب در اسکریپت ایجاد می شوند. توابع با بلوک های Begin، Process و End.

ایجاد اشیاء .NET و COM (New-Object)

اجزای نرم افزاری زیادی با رابط های NET Core و COM وجود دارد که برای مدیران سیستم مفید است. با استفاده از کلاس System.Diagnostics.EventLog، می توانید گزارش های سیستم را مستقیماً از Windows PowerShell مدیریت کنید. بیایید به مثالی از ایجاد یک نمونه از این کلاس با استفاده از cmdlet New-Object با پارامتر -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 ذخیره کردیم. اگرچه خطوط لوله معمولاً در حالت تعاملی استفاده می شوند، نوشتن اسکریپت ها اغلب مستلزم حفظ ارجاع به یک شی است. علاوه بر این، کلاس‌های هسته دات‌نت Core در فضای نام سیستم قرار دارند: PowerShell به‌طور پیش‌فرض به دنبال انواع مشخص شده در آن می‌گردد، بنابراین نوشتن Diagnostics.EventLog به جای System.Diagnostics.EventLog کاملاً صحیح است.

برای کار با لاگ می توانید از روش های مناسب استفاده کنید:

$AppLog | Get-Member -MemberType Method

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

فرض کنید اگر حقوق دسترسی وجود داشته باشد، با روش Clear() پاک می شود:

$AppLog.Clear()

cmdlet New-Object نیز برای کار با اجزای COM استفاده می شود. تعداد زیادی از آنها وجود دارد - از کتابخانه های ارائه شده با سرور اسکریپت ویندوز گرفته تا برنامه های کاربردی ActiveX، مانند اینترنت اکسپلورر. برای ایجاد یک شی 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 را نمی‌توان نمونه‌سازی کرد. آن ها هستند ایستا و فقط شامل خواص و روش های ایستا می شود. اینها اساساً کتابخانه های مرجعی هستند که بدون ایجاد اشیا استفاده می شوند. شما می توانید با قرار دادن نام نوع در براکت مربع به یک کلاس استاتیک از طریق یک literal مراجعه کنید. با این حال، اگر با استفاده از Get-Member به ساختار شی نگاه کنیم، به جای System.Environment، نوع System.RuntimeType را خواهیم دید:

[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 New-Object یک روش کلاسیک، اما دست و پا گیر و قدیمی در نظر گرفته می شود:

$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: کار با اشیا، کلاس های خود

یکی از معایب اشیا از این نوع این است که ترتیب خواص آنها می تواند تغییر کند. برای جلوگیری از این امر، باید از ویژگی [ordered] استفاده کنید:

$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 Add-Member به شما این امکان را می دهد که با استفاده از ساختار "-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 برای این منظور در نظر گرفته شده است، پس از آن باید نام کلاس را مشخص کنید و بدنه آن را در براکت های عملگر توضیح دهید:

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

این یک نوع اصلی دات نت است که دارای بدنه ای است که ویژگی ها، روش ها و سایر عناصر آن را توصیف می کند. بیایید به مثالی از تعریف ساده ترین کلاس نگاه کنیم:

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

برای ایجاد یک شی (نمونه کلاس)، از cmdlet استفاده کنید New-Object، یا به معنای واقعی کلمه از نوع [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 می تواند به عنوان پایه ای برای یک ماژول دیگر خدمت کند - به این ترتیب وراثت پیاده سازی می شود. در این مورد، مجاز است از کلاس های دات نت موجود به عنوان کلاس های پایه استفاده شود:

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

شرح ما از کار با اشیاء در PowerShell به سختی کامل است. در انتشارات بعدی سعی می کنیم با مثال های کاربردی آن را عمیق تر کنیم: پنجمین مقاله از این مجموعه به مسائل یکپارچه سازی پاورشل با اجزای نرم افزار شخص ثالث اختصاص دارد. قسمت های گذشته را می توانید در لینک های زیر مشاهده کنید.

بخش 1: ویژگی های اساسی Windows PowerShell
قسمت 2: مقدمه ای بر زبان برنامه نویسی Windows PowerShell
قسمت 3: انتقال پارامترها به اسکریپت ها و توابع، ایجاد cmdlet

Windows PowerShell چیست و چه کاربردی دارد؟ قسمت 4: کار با اشیا، کلاس های خود

منبع: www.habr.com

اضافه کردن نظر