خروجی متن دستورات در پنجره مفسر PowerShell تنها راهی برای نمایش اطلاعات به شکلی مناسب برای درک انسان است. در واقع چهارشنبه
شرح:
اشیاء در PowerShell
به یاد بیاوریم که یک شی مجموعه ای از فیلدهای داده (ویژگی ها، رویدادها و غیره) و روش هایی برای پردازش آنها (روش ها) است. ساختار آن توسط یک نوع مشخص می شود که معمولاً بر اساس کلاس های مورد استفاده در پلت فرم یکپارچه NET Core است. همچنین امکان کار با اشیاء COM، CIM (WMI) و ADSI وجود دارد. برای انجام اقدامات مختلف روی داده ها به ویژگی ها و متدهایی نیاز است؛ علاوه بر این، در PowerShell، اشیاء را می توان به عنوان آرگومان به توابع و cmdlet ها منتقل کرد، مقادیر آنها را به متغیرها اختصاص داد و همچنین وجود دارد.
مشاهده ساختار اشیا
به عنوان مثال، بیایید cmdlet Get-Process را اجرا کنیم، که به شما امکان می دهد اطلاعاتی در مورد فرآیندهای در حال اجرا در سیستم به دست آورید:
برخی از داده های متنی قالب بندی شده را نمایش می دهد که هیچ ایده ای در مورد ویژگی های اشیاء برگشتی و روش های آنها نمی دهد. برای تنظیم دقیق خروجی، باید یاد بگیریم که چگونه ساختار اشیا را بررسی کنیم و cmdlet Get-Member در این مورد به ما کمک می کند:
Get-Process | Get-Member
در اینجا ما قبلاً نوع و ساختار را می بینیم و با کمک پارامترهای اضافی می توانیم برای مثال فقط ویژگی های شی موجود در ورودی را نمایش دهیم:
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"}
در اینجا دوباره یک نمایش متنی می بینیم، اما اگر می خواهید نوع و ساختار داخلی اشیایی که از خط لوله عبور می کنند را درک کنید، دشوار نیست:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
مرتب سازی اشیاء
هنگام پردازش خط لوله اشیاء، اغلب نیاز به مرتب سازی آنها وجود دارد. به cmdlet Sort-Object نام خصوصیات (کلیدهای مرتبسازی) ارسال میشود و اشیاء مرتب شده بر اساس مقادیرشان را برمیگرداند. به راحتی می توان خروجی فرآیندهای در حال اجرا را بر اساس زمان صرف شده CPU (ویژگی cpu) مرتب کرد:
Get-Process | Sort-Object –Property cpu
هنگام فراخوانی Sort-Object cmdlet، پارامتر -Property را می توان حذف کرد؛ این پارامتر به طور پیش فرض استفاده می شود. برای مرتب سازی معکوس، از پارامتر -نزولی استفاده کنید:
Get-Process | Sort-Object cpu -Descending
انتخاب اشیا و قطعات آنها
cmdlet Select-Object به شما این امکان را می دهد که با استفاده از پارامترهای -First یا -Last تعداد خاصی از اشیاء را در ابتدا یا انتهای خط لوله انتخاب کنید. با کمک آن می توانید اشیاء منفرد یا خصوصیات خاصی را انتخاب کنید و همچنین بر اساس آنها اشیاء جدیدی ایجاد کنید. بیایید به نحوه کار cmdlet با استفاده از مثال های ساده نگاه کنیم.
دستور زیر اطلاعاتی را در مورد 10 فرآیندی که حداکثر مقدار RAM را مصرف می کنند (ویژگی WS) نمایش می دهد:
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
شما می توانید فقط ویژگی های خاصی از اشیاء عبوری از خط لوله را انتخاب کنید و بر اساس آنها موارد جدیدی ایجاد کنید:
Get-Process | Select-Object ProcessName, Id -First 1
در نتیجه عملیات خط لوله، یک شی جدید دریافت خواهیم کرد که ساختار آن با ساختاری که توسط cmdlet Get-Process برگردانده شده متفاوت است. بیایید این را با استفاده از Get-Member تأیید کنیم:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
توجه داشته باشید که Select-Object یک شی منفرد (-First 1) را برمیگرداند که فقط دو مورد از فیلدهایی را که ما مشخص کردیم دارد: مقادیر آنها از اولین شیء ارسال شده به خط لوله توسط cmdlet Get-Process کپی شده است. یکی از راه های ایجاد اشیاء در اسکریپت های 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
cmdlet های دیگری برای کار با اشیا وجود دارد. به عنوان مثال، بیایید در مورد سه مورد مفید صحبت کنیم:
ForEach-object به شما امکان می دهد کد PowerShell را برای هر شی در خط لوله اجرا کنید:
ForEach-Object { блок сценария }
Group-Object اشیاء را بر اساس مقدار ویژگی گروه بندی می کند:
Group-Object PropertyName
اگر آن را با پارامتر -NoElement اجرا کنید، می توانید تعداد عناصر گروه ها را دریابید.
Measure-Object پارامترهای خلاصه مختلف را بر اساس مقادیر فیلد شی در خط لوله جمع می کند (مجموع را محاسبه می کند و همچنین مقدار حداقل، حداکثر یا میانگین را پیدا می کند):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
به طور معمول، cmdlet های مورد بحث به صورت تعاملی استفاده می شوند و اغلب در اسکریپت ایجاد می شوند.
ایجاد اشیاء .NET و COM (New-Object)
اجزای نرم افزاری زیادی با رابط های NET Core و COM وجود دارد که برای مدیران سیستم مفید است. با استفاده از کلاس System.Diagnostics.EventLog، می توانید گزارش های سیستم را مستقیماً از Windows PowerShell مدیریت کنید. بیایید به مثالی از ایجاد یک نمونه از این کلاس با استفاده از cmdlet New-Object با پارامتر -TypeName نگاه کنیم:
New-Object -TypeName System.Diagnostics.EventLog
از آنجایی که ما گزارش رویداد خاصی را مشخص نکردهایم، نمونه حاصل از کلاس هیچ دادهای ندارد. برای تغییر این مورد، باید یک متد سازنده خاص را در حین ایجاد آن با استفاده از پارامتر -ArgumentList فراخوانی کنید. اگر بخواهیم به گزارش برنامه دسترسی داشته باشیم، باید رشته "Application" را به عنوان آرگومان به سازنده ارسال کنیم:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
لطفاً توجه داشته باشید که ما خروجی دستور را در متغیر $AppLog ذخیره کردیم. اگرچه خطوط لوله معمولاً در حالت تعاملی استفاده می شوند، نوشتن اسکریپت ها اغلب مستلزم حفظ ارجاع به یک شی است. علاوه بر این، کلاسهای هسته داتنت Core در فضای نام سیستم قرار دارند: PowerShell بهطور پیشفرض به دنبال انواع مشخص شده در آن میگردد، بنابراین نوشتن Diagnostics.EventLog به جای System.Diagnostics.EventLog کاملاً صحیح است.
برای کار با لاگ می توانید از روش های مناسب استفاده کنید:
$AppLog | Get-Member -MemberType Method
فرض کنید اگر حقوق دسترسی وجود داشته باشد، با روش 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 را نمیتوان نمونهسازی کرد. آن ها هستند
[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 New-Object یک روش کلاسیک، اما دست و پا گیر و قدیمی در نظر گرفته می شود:
$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()
یکی از معایب اشیا از این نوع این است که ترتیب خواص آنها می تواند تغییر کند. برای جلوگیری از این امر، باید از ویژگی [ordered] استفاده کنید:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
گزینه های دیگری برای ایجاد یک شی وجود دارد: در بالا ما با استفاده از cmdlet نگاه کردیم
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
cmdlet Add-Member به شما این امکان را می دهد که با استفاده از ساختار "-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
{
# тело класса
}
این یک نوع اصلی دات نت است که دارای بدنه ای است که ویژگی ها، روش ها و سایر عناصر آن را توصیف می کند. بیایید به مثالی از تعریف ساده ترین کلاس نگاه کنیم:
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 به سختی کامل است. در انتشارات بعدی سعی می کنیم با مثال های کاربردی آن را عمیق تر کنیم: پنجمین مقاله از این مجموعه به مسائل یکپارچه سازی پاورشل با اجزای نرم افزار شخص ثالث اختصاص دارد. قسمت های گذشته را می توانید در لینک های زیر مشاهده کنید.
منبع: www.habr.com