PowerShell مترجم ونڊو ۾ حڪمن جو ٽيڪسٽ آئوٽ صرف معلومات کي ظاهر ڪرڻ جو هڪ طريقو آهي جيڪو انساني تصور لاءِ موزون آهي. دراصل اربع
جواب:
PowerShell ۾ شيون
اچو ته ياد رکون ته هڪ اعتراض ڊيٽا جي فيلڊ (پراپرٽيز، واقعن، وغيره) جو مجموعو آهي ۽ انهن جي پروسيسنگ لاء طريقن (طريقن). ان جي جوڙجڪ ھڪڙي قسم جي طرفان بيان ڪئي وئي آھي، جيڪو عام طور تي متحد .NET ڪور پليٽ فارم ۾ استعمال ٿيل طبقن تي ٻڌل آھي. اهو پڻ ممڪن آهي 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)، اھو اعتراض جيڪو ان پٽ ھوندو آھي ڪٿي-Object cmdlet پائپ لائن سان گڏ گذريو ويندو، ٻي صورت ۾ ($false) ان کي ختم ڪيو ويندو. مثال طور، اچو ته بند ٿيل ونڊوز سرور سروسز جي لسٽ ڏيکاريون، يعني. اُھي جن جي اسٽيٽس پراپرٽي سيٽ ڪئي وئي آھي ”روڪيو“:
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
-پراپرٽي پيٽرولر کي ختم ڪري سگھجي ٿو جڏھن سڏين ٿا Sort-Object cmdlet؛ اھو ڊفالٽ طور استعمال ٿيندو آھي. ريورس ترتيب ڏيڻ لاء، استعمال ڪريو -Descending پيٽرول:
Get-Process | Sort-Object cpu -Descending
شيون ۽ انهن جا حصا چونڊڻ
Select-Object cmdlet توھان کي اجازت ڏئي ٿو ھڪڙي مخصوص تعداد کي چونڊڻ لاءِ پائپ لائن جي شروعات يا آخر ۾ -First or -Last parameters استعمال ڪندي. ان جي مدد سان، توهان اڪيلو شيون يا ڪجهه خاصيتون چونڊي سگهو ٿا، ۽ انهن جي بنياد تي نيون شيون ٺاهي سگهو ٿا. اچو ته ڏسو ته ڪيئن cmdlet ڪم ڪري ٿو سادو مثال استعمال ڪندي.
هيٺ ڏنل حڪم 10 پروسيس بابت معلومات ڏيکاري ٿو جيڪا وڌ ۾ وڌ مقدار کي استعمال ڪندي رام (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
هر شئي لاءِ، گروپ-آبجڪٽ ۽ ماپ-آبجڪٽ
شيون سان ڪم ڪرڻ لاء ٻيا cmdlets آهن. مثال طور، اچو ته ٽي سڀ کان وڌيڪ مفيد بابت ڳالهايون:
ھڪڙي مقصد توهان کي پائيپ لائين ۾ هر شئي لاءِ پاور شيل ڪوڊ هلائڻ جي اجازت ڏئي ٿي:
ForEach-Object { блок сценария }
گروپ- اعتراض ملڪيت جي قيمت جي لحاظ سان شيون گروپن:
Group-Object PropertyName
جيڪڏهن توهان ان کي هلائيندا آهيو -NoElement پيٽرول، توهان ڳولي سگهو ٿا گروپن ۾ عناصر جو تعداد.
ماپ- اعتراض پائپ لائن ۾ آبجیکٹ فيلڊ ويلز ذريعي مختلف سمري پيٽرولر کي گڏ ڪري ٿو (مجموعي کي ڳڻڻ، ۽ پڻ گهٽ ۾ گهٽ، وڌ ۾ وڌ يا اوسط قدر ڳولي ٿو):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
عام طور تي، بحث ڪيل cmdlets استعمال ڪيا ويندا آهن، ۽ اڪثر ڪري اسڪرپٽ ۾ ٺاهيا ويندا آهن.
.NET ۽ COM شيون ٺاهڻ (نئون اعتراض)
.NET ڪور ۽ COM انٽرفيس سان گڏ ڪيترائي سافٽ ويئر جزا آھن جيڪي سسٽم منتظمين لاءِ ڪارآمد آھن. System.Diagnostics.EventLog ڪلاس استعمال ڪندي، توهان سڌو سنئون Windows PowerShell مان سسٽم لاگ منظم ڪري سگهو ٿا. اچو ته هڪ مثال ڏسون هن ڪلاس جو هڪ مثال ٺاهڻ جو نئون-Object cmdlet استعمال ڪندي -TypeName پيٽرول سان:
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
اچو ته چئو ته اهو صاف () طريقي سان صاف ڪيو ويو آهي جيڪڏهن رسائي جا حق آهن:
$AppLog.Clear()
New-Object cmdlet پڻ استعمال ڪيو ويندو آھي ڪم ڪرڻ لاءِ 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 ڪور ڪلاسز فوري نه ٿي سگھندا، بشمول System.Environment ۽ System.Math. اهي آهن
[System.Environment] | Get-Member
صرف جامد ميمبرن کي ڏسڻ لاءِ، ڪال ڪريو Get-Member with the -Static parameter (نوٽ ڪريو اعتراض جو قسم):
[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()
هن قسم جي شين جي نقصانن مان هڪ اهو آهي ته انهن جي ملڪيت جي ترتيب تبديل ٿي سگهي ٿي. هن کان بچڻ لاء، توهان کي [آرڊر ٿيل] وصف استعمال ڪرڻ گهرجي:
$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 متغير جو قسم ScriptBlock نئين طريقي لاءِ ڪوڊ اسٽور ڪرڻ لاءِ.
ملڪيت کي ختم ڪرڻ لاء، لاڳاپيل طريقو استعمال ڪريو:
$object.psobject.properties.remove('Name')
پنهنجا پنهنجا ڪلاس ٺاهڻ
PowerShell 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