Besedilni izhod ukazov v oknu tolmača PowerShell je le način za prikaz informacij v obliki, primerni za človeško zaznavo. Pravzaprav sreda
Kazalo:
Predmeti v PowerShell
Spomnimo se, da je objekt zbirka podatkovnih polj (lastnosti, dogodkov itd.) in metod za njihovo obdelavo (metod). Njegova struktura je določena s tipom, ki običajno temelji na razredih, ki se uporabljajo v enotni platformi .NET Core. Možno je tudi delo z objekti COM, CIM (WMI) in ADSI. Lastnosti in metode so potrebne za izvajanje različnih dejanj na podatkih; poleg tega je v lupini PowerShell mogoče posredovati predmete kot argumente funkcijam in cmdletom, njihove vrednosti dodeliti spremenljivkam, obstaja pa tudi
Ogled strukture predmetov
Na primer, zaženimo cmdlet Get-Process, ki vam omogoča pridobivanje informacij o procesih, ki se izvajajo v sistemu:
Prikazal bo nekaj oblikovanih besedilnih podatkov, ki ne dajejo nobene predstave o lastnostih vrnjenih predmetov in njihovih metod. Za natančno nastavitev izhoda se moramo naučiti, kako preučiti strukturo predmetov, pri čemer nam bo pomagal cmdlet Get-Member:
Get-Process | Get-Member
Tu že vidimo vrsto in strukturo, s pomočjo dodatnih parametrov pa lahko na primer prikažemo samo lastnosti predmeta, vključenega v vnos:
Get-Process | Get-Member -MemberType Property
To znanje bo potrebno za interaktivno reševanje skrbniških težav ali za pisanje lastnih skriptov: na primer za pridobivanje informacij o obešenih procesih z uporabo lastnosti Responding.
Filtriranje predmetov
PowerShell omogoča, da se objekti, ki izpolnjujejo določen pogoj, prenesejo skozi cevovod:
Where-Object { блок сценария }
Rezultat izvajanja bloka skripta v oklepaju mora biti logična vrednost. Če je res ($true), bo predmet, ki je vnesen v ukaz cmdlet Where-Object, poslan po cevovodu, sicer ($false) pa bo izbrisan. Na primer, prikažimo seznam ustavljenih storitev Windows Server, tj. tisti, katerih lastnost statusa je nastavljena na »Stopped«:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Tukaj spet vidimo besedilno predstavitev, a če želite razumeti vrsto in notranjo strukturo predmetov, ki gredo skozi cevovod, ni težko:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Razvrščanje predmetov
Pri cevovodni obdelavi predmetov jih je pogosto treba razvrstiti. Cmdlet Sort-Object prejme imena lastnosti (ključi za razvrščanje) in vrne predmete, razvrščene po njihovih vrednostih. Izhod tekočih procesov je preprosto razvrstiti glede na porabljen čas procesorja (lastnost procesorja):
Get-Process | Sort-Object –Property cpu
Parameter -Property lahko izpustite pri klicu ukaza cmdlet Sort-Object; uporablja se privzeto. Za obratno razvrščanje uporabite parameter -Descending:
Get-Process | Sort-Object cpu -Descending
Izbira predmetov in njihovih delov
Cmdlet Select-Object vam omogoča, da izberete določeno število objektov na začetku ali koncu cevovoda z uporabo parametrov -First ali -Last. Z njegovo pomočjo lahko izberete posamezne predmete ali določene lastnosti in na njihovi podlagi ustvarite nove objekte. Oglejmo si, kako cmdlet deluje na preprostih primerih.
Naslednji ukaz prikaže informacije o 10 procesih, ki porabijo največjo količino RAM-a (lastnost WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Izberete lahko le določene lastnosti predmetov, ki gredo skozi cevovod, in na njihovi podlagi ustvarite nove:
Get-Process | Select-Object ProcessName, Id -First 1
Kot rezultat delovanja cevovoda bomo prejeli nov objekt, katerega struktura se bo razlikovala od strukture, ki jo vrne cmdlet Get-Process. Preverimo to z Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Upoštevajte, da Select-Object vrne en sam predmet (-First 1), ki ima samo dve od polji, ki smo jih podali: njuni vrednosti sta bili kopirani iz prvega predmeta, ki ga je cmdlet Get-Process posredoval v cevovod. Eden od načinov ustvarjanja predmetov v skriptih PowerShell temelji na uporabi Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Z uporabo Select-Object lahko objektom, ki jih je treba predstaviti, dodate izračunane lastnosti
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Poglejmo strukturo predmetov, ki gredo skozi tekoči trak:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object in Measure-Object
Za delo s predmeti obstajajo tudi drugi cmdleti. Kot primer se pogovorimo o treh najbolj uporabnih:
Za vsak predmet omogoča zagon kode PowerShell za vsak predmet v cevovodu:
ForEach-Object { блок сценария }
Skupina-predmet združuje predmete po vrednosti lastnosti:
Group-Object PropertyName
Če ga zaženete s parametrom -NoElement, lahko ugotovite število elementov v skupinah.
Meri-predmet združuje različne parametre povzetka po vrednostih polj objekta v cevovodu (izračuna vsoto in najde tudi najmanjšo, največjo ali povprečno vrednost):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Običajno se obravnavani cmdleti uporabljajo interaktivno in so pogosto ustvarjeni v skriptih.
Ustvarjanje objektov .NET in COM (New-Object)
Obstaja veliko komponent programske opreme z vmesnikoma .NET Core in COM, ki so uporabne za sistemske skrbnike. Z uporabo razreda System.Diagnostics.EventLog lahko upravljate sistemske dnevnike neposredno iz lupine Windows PowerShell. Oglejmo si primer ustvarjanja primerka tega razreda z ukazom cmdlet New-Object s parametrom -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Ker nismo navedli posebnega dnevnika dogodkov, nastali primerek razreda ne vsebuje podatkov. Če želite to spremeniti, morate med ustvarjanjem poklicati posebno metodo konstruktorja s parametrom -ArgumentList. Če želimo dostopati do dnevnika aplikacije, moramo konstruktorju posredovati niz "Application" kot argument:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Upoštevajte, da smo izhod ukaza shranili v spremenljivko $AppLog. Čeprav se cevovodi običajno uporabljajo v interaktivnem načinu, pisanje skriptov pogosto zahteva vzdrževanje sklicevanja na objekt. Poleg tega so osnovni razredi .NET Core vsebovani v sistemskem imenskem prostoru: PowerShell privzeto išče določene vrste v njem, zato je zapis Diagnostics.EventLog namesto System.Diagnostics.EventLog povsem pravilen.
Za delo z dnevnikom lahko uporabite ustrezne metode:
$AppLog | Get-Member -MemberType Method
Recimo, da ga počisti metoda Clear(), če obstajajo pravice dostopa:
$AppLog.Clear()
Cmdlet New-Object se uporablja tudi za delo s komponentami COM. Teh je precej - od knjižnic, ki so priložene skriptnemu strežniku Windows, do aplikacij ActiveX, kot je Internet Explorer. Če želite ustvariti objekt COM, morate nastaviti parameter -ComObject s programskim ProgId želenega razreda:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Za ustvarjanje lastnih objektov s poljubno strukturo se zdi uporaba New-Object preveč arhaična in okorna; ta cmdlet se uporablja za delo s komponentami programske opreme, ki niso PowerShell. V prihodnjih člankih bo to vprašanje podrobneje obravnavano. Poleg objektov .NET in COM bomo raziskovali tudi objekte CIM (WMI) in ADSI.
Klicanje statičnih metod
Nekaterih razredov .NET Core ni mogoče instancirati, vključno s System.Environment in System.Math. So
[System.Environment] | Get-Member
Če si želite ogledati samo statične člane, pokličite Get-Member s parametrom -Static (upoštevajte vrsto predmeta):
[System.Environment] | Get-Member -Static
Za dostop do statičnih lastnosti in metod uporabite dve zaporedni dvopičji namesto pike za literalom:
[System.Environment]::OSVersion
Or
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Vnesite PSCustomObject
Med številnimi vrstami podatkov, ki so na voljo v lupini PowerShell, velja omeniti PSCustomObject, namenjen shranjevanju objektov s poljubno strukturo. Ustvarjanje takega predmeta z ukazom cmdlet New-Object velja za klasičen, a okoren in zastarel način:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Poglejmo strukturo predmeta:
$object | Get-Member
Od PowerShell 3.0 dalje je na voljo druga sintaksa:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Do podatkov lahko dostopate na enega od enakovrednih načinov:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Tukaj je primer pretvorbe obstoječe zgoščene tabele v objekt:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Ena od pomanjkljivosti objektov te vrste je, da se lahko spremeni vrstni red njihovih lastnosti. Da bi se temu izognili, morate uporabiti atribut [ordered]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Obstajajo še druge možnosti za ustvarjanje predmeta: zgoraj smo si ogledali uporabo ukaza cmdlet
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Cmdlet Add-Member vam omogoča dodajanje ne samo lastnosti, ampak tudi metod predhodno ustvarjenemu $objectu z uporabo konstrukta "-MemberType ScriptMethod":
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Upoštevajte, da smo za shranjevanje kode za novo metodo uporabili spremenljivko $ScriptBlock tipa ScriptBlock.
Za odstranitev lastnosti uporabite ustrezno metodo:
$object.psobject.properties.remove('Name')
Ustvarjanje lastnih razredov
PowerShell 5.0 je uvedel možnost definiranja
class MyClass
{
# тело класса
}
To je pravi tip .NET Core s telesom, ki opisuje njegove lastnosti, metode in druge elemente. Oglejmo si primer definiranja najpreprostejšega razreda:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Če želite ustvariti predmet (instanco razreda), uporabite cmdlet
$object = New-Object -TypeName MyClass
ali
$object = [MyClass]::new()
Analizirajmo strukturo predmeta:
$object | Get-Member
Ne pozabite na obseg: na ime tipa se ne morete sklicevati kot na niz ali uporabiti literala tipa zunaj skripta ali modula, v katerem je definiran razred. V tem primeru lahko funkcije vrnejo primerke razreda (objekte), ki bodo dostopni izven modula ali skripta.
Ko ustvarite predmet, izpolnite njegove lastnosti:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Upoštevajte, da opis razreda ne določa samo vrst lastnosti, ampak tudi njihove privzete vrednosti:
class Example
{
[string]$Name = 'John Doe'
}
Opis metode razreda je podoben opisu funkcije, vendar brez uporabe funkcijske besede. Kot v funkciji se parametri po potrebi posredujejo metodam:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Zdaj se lahko predstavnik našega razreda nasmehne:
$object = [MyClass]::new()
$object.Smile($true)
Metode so lahko preobremenjene; poleg tega ima razred
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Naš opis dela s predmeti v PowerShell je komaj izčrpen. V naslednjih publikacijah ga bomo poskušali poglobiti s praktičnimi primeri: peti članek v seriji bo posvečen vprašanjem integracije PowerShell s komponentami programske opreme drugih proizvajalcev. Pretekle dele najdete na spodnjih povezavah.
Vir: www.habr.com