پاور شیل انٹرپریٹر ونڈو میں کمانڈز کا ٹیکسٹ آؤٹ پٹ معلومات کو انسانی ادراک کے لیے موزوں شکل میں ظاہر کرنے کا صرف ایک طریقہ ہے۔ دراصل بدھ
فہرست کا خانہ:
پاور شیل میں آبجیکٹ
آئیے یاد رکھیں کہ ایک آبجیکٹ ڈیٹا فیلڈز (پراپرٹیز، ایونٹس وغیرہ) اور ان پر کارروائی کے طریقوں (طریقوں) کا مجموعہ ہے۔ اس کا ڈھانچہ ایک قسم کے ذریعہ بیان کیا جاتا ہے، جو عام طور پر متحد .NET کور پلیٹ فارم میں استعمال ہونے والی کلاسوں پر مبنی ہوتا ہے۔ COM، CIM (WMI) اور ADSI اشیاء کے ساتھ کام کرنا بھی ممکن ہے۔ ڈیٹا پر مختلف کارروائیوں کو انجام دینے کے لیے پراپرٹیز اور طریقوں کی ضرورت ہوتی ہے؛ اس کے علاوہ، پاور شیل میں، آبجیکٹ کو فنکشنز اور cmdlets کو دلیل کے طور پر منتقل کیا جا سکتا ہے، ان کی قدروں کو متغیرات کو تفویض کیا جا سکتا ہے، اور اس کے علاوہ
اشیاء کی ساخت کو دیکھنا
مثال کے طور پر، آئیے Get-Process cmdlet چلائیں، جو آپ کو سسٹم میں چلنے والے عمل کے بارے میں معلومات حاصل کرنے کی اجازت دیتا ہے:
یہ کچھ فارمیٹ شدہ ٹیکسٹ ڈیٹا کو ظاہر کرے گا جو واپس کی گئی اشیاء کی خصوصیات اور ان کے طریقوں کے بارے میں کوئی اندازہ نہیں دیتا ہے۔ آؤٹ پٹ کو ٹھیک کرنے کے لیے، ہمیں اشیاء کی ساخت کو جانچنے کا طریقہ سیکھنا ہوگا، اور Get-Member cmdlet اس میں ہماری مدد کرے گا:
Get-Process | Get-Member
یہاں ہم پہلے ہی قسم اور ساخت دیکھ چکے ہیں، اور اضافی پیرامیٹرز کی مدد سے ہم، مثال کے طور پر، صرف ان پٹ میں شامل آبجیکٹ کی خصوصیات کو ظاہر کر سکتے ہیں:
Get-Process | Get-Member -MemberType Property
انتظامیہ کے مسائل کو انٹرایکٹو طریقے سے حل کرنے یا آپ کے اپنے اسکرپٹ لکھنے کے لیے اس علم کی ضرورت ہوگی: مثال کے طور پر، ریسپانڈنگ پراپرٹی کا استعمال کرتے ہوئے ہنگ پروسیس کے بارے میں معلومات حاصل کرنے کے لیے۔
اشیاء کو فلٹر کرنا
پاور شیل ایسی اشیاء کو اجازت دیتا ہے جو ایک خاص شرط کو پورا کرتی ہیں پائپ لائن سے گزرنے کی:
Where-Object { блок сценария }
قوسین کے اندر اسکرپٹ بلاک پر عمل کرنے کا نتیجہ بولین ویلیو ہونا چاہیے۔ اگر یہ سچ ہے ($true)، تو وہ آبجیکٹ جو Where-Object cmdlet میں ان پٹ ہے پائپ لائن کے ساتھ گزر جائے گا، بصورت دیگر ($false) اسے حذف کر دیا جائے گا۔ مثال کے طور پر، آئیے رکی ہوئی ونڈوز سرور سروسز کی فہرست دکھائیں، یعنی وہ جن کی اسٹیٹس پراپرٹی "روک گئی" پر سیٹ ہے:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
یہاں ایک بار پھر ہم متنی نمائندگی دیکھتے ہیں، لیکن اگر آپ پائپ لائن سے گزرنے والی اشیاء کی قسم اور اندرونی ساخت کو سمجھنا چاہتے ہیں تو یہ مشکل نہیں ہے:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
اشیاء کو چھانٹنا
جب اشیاء کی پائپ لائن پروسیسنگ، اکثر ان کو ترتیب دینے کی ضرورت ہوتی ہے۔ Sort-Object cmdlet کو پراپرٹیز کے ناموں (سانٹنگ کیز) کو پاس کیا جاتا ہے اور ان کی اقدار کے مطابق ترتیب دی گئی اشیاء کو لوٹاتا ہے۔ چلنے والے عمل کے آؤٹ پٹ کو CPU وقت (cpu پراپرٹی) کے حساب سے ترتیب دینا آسان ہے:
Get-Process | Sort-Object –Property cpu
Sort-Object cmdlet کو کال کرتے وقت -Property پیرامیٹر کو چھوڑا جا سکتا ہے؛ یہ بطور ڈیفالٹ استعمال ہوتا ہے۔ الٹ چھانٹ کے لیے، -Descending پیرامیٹر استعمال کریں:
Get-Process | Sort-Object cpu -Descending
اشیاء اور ان کے حصوں کا انتخاب
Select-Object cmdlet آپ کو پائپ لائن کے شروع یا آخر میں -First یا -Last پیرامیٹرز کا استعمال کرتے ہوئے اشیاء کی ایک مخصوص تعداد کو منتخب کرنے کی اجازت دیتا ہے۔ اس کی مدد سے، آپ واحد اشیاء یا مخصوص خصوصیات کو منتخب کر سکتے ہیں، اور ان کی بنیاد پر نئی اشیاء بھی بنا سکتے ہیں۔ آئیے دیکھتے ہیں کہ سادہ مثالوں کا استعمال کرتے ہوئے cmdlet کیسے کام کرتا ہے۔
درج ذیل کمانڈ زیادہ سے زیادہ RAM (WS پراپرٹی) استعمال کرنے والے 10 عملوں کے بارے میں معلومات دکھاتی ہے۔
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
نوٹ کریں کہ سلیکٹ-آبجیکٹ ایک واحد آبجیکٹ (-پہلا 1) لوٹاتا ہے جس میں صرف دو فیلڈز ہیں جن کی ہم نے وضاحت کی ہے: ان کی قدریں Get-Process cmdlet کے ذریعے پائپ لائن میں بھیجی گئی پہلی آبجیکٹ سے کاپی کی گئی تھیں۔ PowerShell اسکرپٹس میں آبجیکٹ بنانے کا ایک طریقہ Select-Object کے استعمال پر مبنی ہے:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
سلیکٹ-آبجیکٹ کا استعمال کرتے ہوئے، آپ ان اشیاء میں کمپیوٹڈ پراپرٹیز شامل کر سکتے ہیں جن کی نمائندگی کرنے کی ضرورت ہے۔
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
آئیے کنویئر سے گزرنے والی اشیاء کی ساخت کو دیکھتے ہیں:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ہر آبجیکٹ، گروپ آبجیکٹ اور پیمائش آبجیکٹ کے لیے
اشیاء کے ساتھ کام کرنے کے لیے دیگر cmdlets ہیں۔ مثال کے طور پر، آئیے تین سب سے مفید کے بارے میں بات کرتے ہیں:
ہر چیز کے لیے۔ آپ کو پائپ لائن میں موجود ہر شے کے لیے پاور شیل کوڈ چلانے کی اجازت دیتا ہے:
ForEach-Object { блок сценария }
گروپ آبجیکٹ پراپرٹی ویلیو کے لحاظ سے اشیاء کو گروپ کرتا ہے:
Group-Object PropertyName
اگر آپ اسے -NoElement پیرامیٹر کے ساتھ چلاتے ہیں، تو آپ گروپوں میں عناصر کی تعداد معلوم کر سکتے ہیں۔
پیمائش - آبجیکٹ پائپ لائن میں آبجیکٹ فیلڈ ویلیوز کے ذریعہ مختلف سمری پیرامیٹرز کو جمع کرتا ہے (رقم کا حساب لگاتا ہے، اور کم از کم، زیادہ سے زیادہ یا اوسط قدر بھی تلاش کرتا ہے):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
عام طور پر، زیر بحث cmdlets انٹرایکٹو طور پر استعمال ہوتے ہیں، اور اکثر اسکرپٹ میں بنائے جاتے ہیں۔
.NET اور COM آبجیکٹ (نیا آبجیکٹ) بنانا
.NET کور اور COM انٹرفیس کے ساتھ سافٹ ویئر کے بہت سے اجزاء ہیں جو سسٹم ایڈمنسٹریٹرز کے لیے مفید ہیں۔ System.Diagnostics.EventLog کلاس کا استعمال کرتے ہوئے، آپ ونڈوز پاور شیل سے براہ راست سسٹم لاگز کا نظم کر سکتے ہیں۔ آئیے -TypeName پیرامیٹر کے ساتھ New-Object cmdlet کا استعمال کرتے ہوئے اس کلاس کی مثال بنانے کی ایک مثال دیکھیں:
New-Object -TypeName System.Diagnostics.EventLog
چونکہ ہم نے ایک مخصوص ایونٹ لاگ کی وضاحت نہیں کی ہے، اس لیے کلاس کے نتیجے میں کوئی ڈیٹا نہیں ہے۔ اسے تبدیل کرنے کے لیے، آپ کو -ArgumentList پیرامیٹر کا استعمال کرتے ہوئے اس کی تخلیق کے دوران ایک خاص کنسٹرکٹر طریقہ کو کال کرنا ہوگا۔ اگر ہم ایپلیکیشن لاگ تک رسائی حاصل کرنا چاہتے ہیں، تو ہمیں کنسٹرکٹر کو دلیل کے طور پر "ایپلی کیشن" سٹرنگ پاس کرنا چاہیے:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
براہ کرم نوٹ کریں کہ ہم نے کمانڈ کے آؤٹ پٹ کو $AppLog متغیر میں محفوظ کیا ہے۔ اگرچہ پائپ لائنیں عام طور پر انٹرایکٹو موڈ میں استعمال ہوتی ہیں، لیکن اسکرپٹ لکھنے کے لیے اکثر کسی چیز کا حوالہ برقرار رکھنے کی ضرورت ہوتی ہے۔ مزید برآں، بنیادی .NET کور کلاسز سسٹم کے نام کی جگہ میں موجود ہیں: پاور شیل بطور ڈیفالٹ اس میں مخصوص اقسام کو تلاش کرتا ہے، اس لیے System.Diagnostics.EventLog کی بجائے Diagnostics.EventLog لکھنا بالکل درست ہے۔
لاگ کے ساتھ کام کرنے کے لیے، آپ مناسب طریقے استعمال کر سکتے ہیں:
$AppLog | Get-Member -MemberType Method
ہم کہتے ہیں کہ اسے Clear() طریقہ سے صاف کیا جاتا ہے اگر رسائی کے حقوق موجود ہیں:
$AppLog.Clear()
New-Object cmdlet بھی COM اجزاء کے ساتھ کام کرنے کے لیے استعمال ہوتا ہے۔ ان میں سے بہت سارے ہیں - ونڈوز اسکرپٹ سرور کے ساتھ فراہم کردہ لائبریریوں سے لے کر ActiveX ایپلی کیشنز، جیسے انٹرنیٹ ایکسپلورر تک۔ COM آبجیکٹ بنانے کے لیے، آپ کو مطلوبہ کلاس کے پروگرامیٹک ProgId کے ساتھ -ComObject پیرامیٹر سیٹ کرنا ہوگا۔
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 کور کلاسز کو فوری نہیں کیا جا سکتا، بشمول System.Environment اور System.Math۔ وہ ہیں
[System.Environment] | Get-Member
صرف جامد اراکین کو دیکھنے کے لیے، -Static پیرامیٹر کے ساتھ Get-Member کو کال کریں (آجیکٹ کی قسم کو نوٹ کریں):
[System.Environment] | Get-Member -Static
جامد خصوصیات اور طریقوں تک رسائی حاصل کرنے کے لیے، لغوی کے بعد وقفہ کے بجائے دو لگاتار کالون استعمال کریں:
[System.Environment]::OSVersion
یا کیا
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
PSCustomObject ٹائپ کریں۔
PowerShell میں دستیاب متعدد ڈیٹا اقسام میں سے، PSCustomObject کا ذکر کرنا ضروری ہے، جو ایک من مانی ساخت کے ساتھ اشیاء کو ذخیرہ کرنے کے لیے ڈیزائن کیا گیا ہے۔ New-Object 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()
اس قسم کی اشیاء کا ایک نقصان یہ ہے کہ ان کی خصوصیات کی ترتیب بدل سکتی ہے۔ اس سے بچنے کے لیے، آپ کو [ordered] وصف استعمال کرنا چاہیے:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
آبجیکٹ بنانے کے لیے اور بھی آپشنز ہیں: اوپر ہم نے cmdlet کو استعمال کرتے ہوئے دیکھا
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Add-Member cmdlet آپ کو "-MemberType ScriptMethod" کنسٹرکٹ کا استعمال کرکے نہ صرف پراپرٹیز بلکہ پہلے سے بنائے گئے $object میں طریقے شامل کرنے کی اجازت دیتا ہے:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
براہ کرم نوٹ کریں کہ ہم نے نئے طریقہ کے لیے کوڈ کو ذخیرہ کرنے کے لیے اسکرپٹ بلاک قسم کا $ScriptBlock متغیر استعمال کیا۔
خصوصیات کو ہٹانے کے لیے، متعلقہ طریقہ استعمال کریں:
$object.psobject.properties.remove('Name')
اپنی اپنی کلاسز بنانا
پاور شیل 5.0 نے وضاحت کرنے کی صلاحیت متعارف کرائی
class MyClass
{
# тело класса
}
یہ ایک حقیقی .NET کور قسم ہے، جس میں ایک باڈی ہے جو اس کی خصوصیات، طریقوں اور دیگر عناصر کو بیان کرتی ہے۔ آئیے سب سے آسان کلاس کی وضاحت کرنے کی ایک مثال دیکھیں:
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