Dalja e tekstit të komandave në dritaren e interpretuesit PowerShell është vetëm një mënyrë për të shfaqur informacionin në një formë të përshtatshme për perceptimin njerëzor. Në fakt të mërkurën
Përmbajtja:
Objektet në PowerShell
Le të kujtojmë se një objekt është një koleksion fushash të dhënash (veti, ngjarje, etj.) dhe metoda për përpunimin e tyre (metoda). Struktura e tij specifikohet nga një lloj, i cili zakonisht bazohet në klasat e përdorura në platformën e unifikuar .NET Core. Është gjithashtu e mundur të punohet me objekte COM, CIM (WMI) dhe ADSI. Vetitë dhe metodat janë të nevojshme për të kryer veprime të ndryshme në të dhëna; përveç kësaj, në PowerShell, objektet mund të kalohen si argumente në funksione dhe cmdlet, t'u caktohen vlerat e tyre variablave, dhe ka gjithashtu
Shikimi i strukturës së objekteve
Për shembull, le të ekzekutojmë cmdlet Get-Process, i cili ju lejon të merrni informacion në lidhje me proceset që ekzekutohen në sistem:
Do të shfaqë disa të dhëna teksti të formatuara që nuk japin asnjë ide për vetitë e objekteve të kthyera dhe metodat e tyre. Për të rregulluar saktë daljen, duhet të mësojmë se si të ekzaminojmë strukturën e objekteve dhe cmdlet Get-Amber do të na ndihmojë për këtë:
Get-Process | Get-Member
Këtu ne shohim tashmë llojin dhe strukturën, dhe me ndihmën e parametrave shtesë, për shembull, mund të shfaqim vetëm vetitë e objektit të përfshirë në hyrje:
Get-Process | Get-Member -MemberType Property
Kjo njohuri do të jetë e nevojshme për të zgjidhur problemet e administrimit në mënyrë interaktive ose për të shkruar skriptet tuaja: për shembull, për të marrë informacion rreth proceseve të varura duke përdorur veçorinë Përgjigje.
Filtrimi i objekteve
PowerShell lejon që objektet që plotësojnë një kusht të caktuar të kalohen përmes një tubacioni:
Where-Object { блок сценария }
Rezultati i ekzekutimit të bllokut të skriptit brenda kllapave duhet të jetë një vlerë boolean. Nëse është e vërtetë ($true), objekti që futet në cmdlet Where-Object do të kalohet përgjatë tubacionit, përndryshe ($false) do të fshihet. Për shembull, le të shfaqim një listë të shërbimeve të ndërprera të Windows Server, d.m.th. ata, prona e Statusit të të cilëve është caktuar në "Stoped":
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Këtu përsëri shohim një paraqitje tekstuale, por nëse doni të kuptoni llojin dhe strukturën e brendshme të objekteve që kalojnë nëpër tubacion, nuk është e vështirë:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Renditja e objekteve
Gjatë përpunimit të objekteve me tubacion, shpesh lind nevoja për t'i renditur ato. cmdlet Sort-Object i transmetohen emrat e vetive (çelësat e renditjes) dhe kthen objektet të renditura sipas vlerave të tyre. Është e lehtë të renditësh rezultatin e proceseve të ekzekutimit sipas kohës së shpenzuar të CPU-së (vetia e CPU):
Get-Process | Sort-Object –Property cpu
Parametri -Property mund të hiqet kur thirret cmdlet Sort-Object; ai përdoret si parazgjedhje. Për renditjen e kundërt, përdorni parametrin -Descending:
Get-Process | Sort-Object cpu -Descending
Përzgjedhja e objekteve dhe pjesëve të tyre
cmdlet Select-Object ju lejon të zgjidhni një numër specifik objektesh në fillim ose në fund të një tubacioni duke përdorur parametrat -First ose -Last. Me ndihmën e tij, ju mund të zgjidhni objekte të vetme ose veti të caktuara, dhe gjithashtu të krijoni objekte të reja bazuar në to. Le të shohim se si funksionon cmdlet duke përdorur shembuj të thjeshtë.
Komanda e mëposhtme shfaq informacion në lidhje me 10 proceset që konsumojnë sasinë maksimale të RAM-it (vetia WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Ju mund të zgjidhni vetëm disa veçori të objekteve që kalojnë përmes tubacionit dhe të krijoni të reja bazuar në to:
Get-Process | Select-Object ProcessName, Id -First 1
Si rezultat i funksionimit të tubacionit, ne do të marrim një objekt të ri, struktura e të cilit do të ndryshojë nga struktura e kthyer nga cmdlet Get-Process. Le ta verifikojmë këtë duke përdorur Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Vini re se Select-Object kthen një objekt të vetëm (-First 1) që ka vetëm dy nga fushat që specifikuam: vlerat e tyre u kopjuan nga objekti i parë i kaluar në tubacion nga cmdlet Get-Process. Një nga mënyrat për të krijuar objekte në skriptet PowerShell bazohet në përdorimin e Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Duke përdorur Select-Object, mund të shtoni vetitë e llogaritura tek objektet që duhet të paraqiten si
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Le të shohim strukturën e objekteve që kalojnë nëpër transportues:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
Përçdo-objekt, grup-objekt dhe masë-objekt
Ka cmdlet të tjera për të punuar me objekte. Si shembull, le të flasim për tre më të dobishmet:
PërÇdo-Objekt ju lejon të ekzekutoni kodin PowerShell për çdo objekt në tubacion:
ForEach-Object { блок сценария }
Grupi-Objekt grupon objektet sipas vlerës së pronës:
Group-Object PropertyName
Nëse e ekzekutoni me parametrin -NoElement, mund të zbuloni numrin e elementeve në grupe.
Masa-Objekt grumbullon parametra të ndryshëm përmbledhës sipas vlerave të fushës së objektit në tubacion (llogarit shumën dhe gjithashtu gjen vlerën minimale, maksimale ose mesatare):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Në mënyrë tipike, cmdlet-et e diskutuara përdoren në mënyrë interaktive dhe shpesh krijohen në skripta.
Krijimi i objekteve .NET dhe COM (New-Object)
Ka shumë komponentë softuerësh me ndërfaqe .NET Core dhe COM që janë të dobishëm për administratorët e sistemit. Duke përdorur klasën System.Diagnostics.EventLog, mund të menaxhoni regjistrat e sistemit direkt nga Windows PowerShell. Le të shohim një shembull të krijimit të një shembulli të kësaj klase duke përdorur cmdlet New-Object me parametrin -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Meqenëse nuk specifikuam një regjistër të veçantë të ngjarjeve, shembulli që rezulton i klasës nuk përmban të dhëna. Për ta ndryshuar këtë, duhet të thërrisni një metodë të veçantë konstruktori gjatë krijimit të saj duke përdorur parametrin -ArgumentList. Nëse duam të hyjmë në regjistrin e aplikacionit, duhet t'ia kalojmë vargun "Application" si argument te konstruktori:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Ju lutemi vini re se ne kemi ruajtur daljen e komandës në variablin $AppLog. Megjithëse tubacionet përdoren zakonisht në modalitetin interaktiv, shkrimi i skripteve shpesh kërkon mbajtjen e një referimi ndaj një objekti. Përveç kësaj, klasat kryesore .NET Core përmbahen në hapësirën e emrave të Sistemit: PowerShell si parazgjedhje kërkon lloje të specifikuara në të, kështu që shkrimi i Diagnostics.EventLog në vend të System.Diagnostics.EventLog është mjaft i saktë.
Për të punuar me regjistrin, mund të përdorni metodat e duhura:
$AppLog | Get-Member -MemberType Method
Le të themi se pastrohet me metodën Clear() nëse ka të drejta aksesi:
$AppLog.Clear()
New-Object cmdlet përdoret gjithashtu për të punuar me komponentët COM. Ka shumë prej tyre - nga bibliotekat e pajisura me serverin e skripteve të Windows deri te aplikacionet ActiveX, siç është Internet Explorer. Për të krijuar një objekt COM, duhet të vendosni parametrin -ComObject me ProgId programatik të klasës së dëshiruar:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Për të krijuar objektet tuaja me një strukturë arbitrare, përdorimi i New-Object duket shumë arkaik dhe i rëndë; ky cmdlet përdoret për të punuar me komponentë softuerësh jashtë PowerShell. Në artikujt e ardhshëm kjo çështje do të diskutohet më në detaje. Përveç objekteve .NET dhe COM, ne do të eksplorojmë gjithashtu objektet CIM (WMI) dhe ADSI.
Thirrja e metodave statike
Disa klasa .NET Core nuk mund të instantohen, duke përfshirë System.Environment dhe System.Math. Ata janë
[System.Environment] | Get-Member
Për të parë vetëm anëtarët statikë, thirrni Get-Member me parametrin -Static (vini re llojin e objektit):
[System.Environment] | Get-Member -Static
Për të hyrë në vetitë dhe metodat statike, përdorni dy dy pika të njëpasnjëshme në vend të një periudhe pas fjalës së mirëfilltë:
[System.Environment]::OSVersion
ose
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Shkruani PSCustomObject
Ndër llojet e shumta të të dhënave të disponueshme në PowerShell, vlen të përmendet PSCustomObject, i krijuar për ruajtjen e objekteve me një strukturë arbitrare. Krijimi i një objekti të tillë duke përdorur cmdlet New-Object konsiderohet një mënyrë klasike, por e rëndë dhe e vjetëruar:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Le të shohim strukturën e objektit:
$object | Get-Member
Duke filluar me PowerShell 3.0, një sintaksë tjetër është e disponueshme:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Ju mund t'i aksesoni të dhënat në një nga mënyrat ekuivalente:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Këtu është një shembull i konvertimit të një hashtable ekzistues në një objekt:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Një nga disavantazhet e objekteve të këtij lloji është se rendi i vetive të tyre mund të ndryshojë. Për të shmangur këtë, duhet të përdorni atributin [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Ekzistojnë opsione të tjera për krijimin e një objekti: më lart ne shikuam duke përdorur cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
cmdlet Add-Amber ju lejon të shtoni jo vetëm veti, por edhe metoda në një $object të krijuar më parë duke përdorur konstruktin "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Ju lutemi vini re se kemi përdorur variablin $ScriptBlock të llojit ScriptBlock për të ruajtur kodin për metodën e re.
Për të hequr vetitë, përdorni metodën përkatëse:
$object.psobject.properties.remove('Name')
Krijimi i klasave tuaja
PowerShell 5.0 prezantoi aftësinë për të përcaktuar
class MyClass
{
# тело класса
}
Ky është një lloj i vërtetë .NET Core, me një trup që përshkruan vetitë, metodat dhe elementët e tjerë të tij. Le të shohim një shembull të përcaktimit të klasës më të thjeshtë:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Për të krijuar një objekt (një shembull i klasës), përdorni cmdlet
$object = New-Object -TypeName MyClass
ose
$object = [MyClass]::new()
Le të analizojmë strukturën e objektit:
$object | Get-Member
Mos harroni për shtrirjen: nuk mund t'i referoheni emrit të llojit si varg ose të përdorni një lloj literal jashtë skriptit ose modulit në të cilin është përcaktuar klasa. Në këtë rast, funksionet mund të kthejnë instancat e klasës (objektet) që do të jenë të aksesueshme jashtë modulit ose skriptit.
Pas krijimit të objektit, plotësoni vetitë e tij:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Vini re se përshkrimi i klasës specifikon jo vetëm llojet e vetive, por edhe vlerat e tyre të paracaktuara:
class Example
{
[string]$Name = 'John Doe'
}
Përshkrimi i një metode të klasës i ngjan përshkrimit të një funksioni, por pa përdorur fjalën e funksionit. Si në një funksion, parametrat i kalohen metodave nëse është e nevojshme:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Tani përfaqësuesi i klasës sonë mund të buzëqeshë:
$object = [MyClass]::new()
$object.Smile($true)
Metodat mund të mbingarkohen; përveç kësaj, një klasë ka
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Përshkrimi ynë i punës me objekte në PowerShell nuk është pothuajse shterues. Në botimet e mëposhtme do të përpiqemi ta thellojmë me shembuj praktikë: artikulli i pestë i serisë do t'i kushtohet çështjeve të integrimit të PowerShell me komponentët e softuerit të palëve të treta. Pjesët e kaluara mund të gjenden në lidhjet e mëposhtme.
Burimi: www.habr.com