PowerShell පරිවර්තක කවුළුවේ ඇති විධානවල පෙළ ප්රතිදානය මිනිස් සංජානනයට සුදුසු ආකාරයෙන් තොරතුරු ප්රදර්ශනය කිරීමේ ක්රමයක් පමණි. ඇත්තටම බදාදා
අන්තර්ගත වගුව:
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 { блок сценария }
වරහන් තුළ ස්ක්රිප්ට් බ්ලොක් ක්රියාත්මක කිරීමේ ප්රතිඵලය බූලියන් අගයක් විය යුතුය. එය සත්ය ($සත්ය) නම්, Where-Object cmdlet වෙත ආදානය කරන වස්තුව නල මාර්ගය ඔස්සේ යවනු ලැබේ, එසේ නොමැතිනම් ($false) එය මකා දැමෙනු ඇත. උදාහරණයක් ලෙස, නවතා දැමූ Windows Server සේවා ලැයිස්තුවක් පෙන්වමු, i.e. තත්ත්ව දේපල "නැවතුම්" ලෙස සකසා ඇති අය:
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
Select-Object විසින් අප සඳහන් කළ ක්ෂේත්ර දෙකක් පමණක් ඇති තනි වස්තුවක් (-පළමු 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 ඇත. උදාහරණයක් ලෙස, අපි වඩාත් ප්රයෝජනවත් තුන ගැන කතා කරමු:
එක් එක් වස්තුව සඳහා නල මාර්ගයේ එක් එක් වස්තුව සඳහා 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 වෙතින් සෘජුවම පද්ධති ලොග් කළමනාකරණය කළ හැක. -TypeName පරාමිතිය සමඟ New-Object cmdlet භාවිතා කරමින් මෙම පන්තියේ අවස්ථාවක් නිර්මාණය කිරීමේ උදාහරණයක් බලමු:
New-Object -TypeName System.Diagnostics.EventLog
අපි නිශ්චිත සිදුවීම් ලොගයක් සඳහන් නොකළ බැවින්, පන්තියේ ප්රතිඵලයක් ලෙස ලැබෙන අවස්ථාවෙහි දත්ත නොමැත. මෙය වෙනස් කිරීම සඳහා, ඔබ විසින් -ArgumentList පරාමිතිය භාවිතයෙන් එය නිර්මාණය කිරීමේදී විශේෂ ඉදිකිරීම් ක්රමයක් ඇමතීමට අවශ්ය වේ. අපට යෙදුම් ලොගයට ප්රවේශ වීමට අවශ්ය නම්, අපි "යෙදුම" තන්තුව තර්කයක් ලෙස ඉදිකිරීම්කරු වෙත යැවිය යුතුය:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
අපි $AppLog විචල්යයේ විධානයේ ප්රතිදානය සුරැකූ බව කරුණාවෙන් සලකන්න. නල මාර්ග අන්තර්ක්රියාකාරී මාදිලියේ බහුලව භාවිතා වුවද, ස්ක්රිප්ට් ලිවීමට බොහෝ විට වස්තුවක් වෙත යොමුවක් පවත්වා ගැනීම අවශ්ය වේ. මීට අමතරව, මූලික .NET Core පන්ති පද්ධති නාම අවකාශයේ අඩංගු වේ: PowerShell පෙරනිමියෙන් එහි නිශ්චිත වර්ග සඳහා සොයයි, එබැවින් System.Diagnostics.EventLog වෙනුවට Diagnostics.EventLog ලිවීම ඉතා නිවැරදිය.
ලොගය සමඟ වැඩ කිරීමට, ඔබට සුදුසු ක්රම භාවිතා කළ හැකිය:
$AppLog | Get-Member -MemberType Method
ප්රවේශ අයිතිවාසිකම් තිබේ නම් එය Clear() ක්රමය මගින් නිෂ්කාශනය වේ යැයි කියමු:
$AppLog.Clear()
New-Object cmdlet ද COM සංරචක සමඟ වැඩ කිරීමට භාවිතා කරයි. ඒවායින් බොහොමයක් තිබේ - වින්ඩෝස් ස්ක්රිප්ට් සේවාදායකය සමඟ සපයා ඇති පුස්තකාලවල සිට Internet Explorer වැනි 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 වස්තු ද ගවේෂණය කරන්නෙමු.
ස්ථිතික ක්රම ඇමතීම
System.Environment සහ System.Math ඇතුළුව සමහර .NET Core පන්ති ක්ෂණිකව ආරම්භ කළ නොහැක. අර තියෙන්නේ
[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()
මෙම වර්ගයේ වස්තූන්ගේ අවාසි වලින් එකක් නම් ඒවායේ ගුණාංගවල අනුපිළිවෙල වෙනස් විය හැකිය. මෙය වළක්වා ගැනීම සඳහා, ඔබ [ඇණවුම් කළ] ගුණාංගය භාවිතා කළ යුතුය:
$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 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