Ieșirea textului comenzilor din fereastra interpretului PowerShell este doar o modalitate de a afișa informații într-o formă potrivită pentru percepția umană. De fapt miercuri
Cuprins:
Obiecte în PowerShell
Să ne amintim că un obiect este o colecție de câmpuri de date (proprietăți, evenimente etc.) și metode de procesare a acestora (metode). Structura sa este specificată de un tip, care se bazează de obicei pe clasele utilizate în platforma unificată .NET Core. De asemenea, este posibil să lucrați cu obiecte COM, CIM (WMI) și ADSI. Sunt necesare proprietăți și metode pentru a efectua diverse acțiuni asupra datelor; în plus, în PowerShell, obiectele pot fi transmise ca argumente funcțiilor și cmdlet-urilor, alocate valorile acestora variabilelor și există, de asemenea,
Vizualizarea structurii obiectelor
De exemplu, să rulăm cmdletul Get-Process, care vă permite să obțineți informații despre procesele care rulează în sistem:
Va afișa câteva date text formatate care nu oferă nicio idee despre proprietățile obiectelor returnate și metodele acestora. Pentru a ajusta ieșirea, trebuie să învățăm cum să examinăm structura obiectelor, iar cmdletul Get-Member ne va ajuta în acest sens:
Get-Process | Get-Member
Aici vedem deja tipul și structura, iar cu ajutorul unor parametri suplimentari putem, de exemplu, afișa numai proprietățile obiectului inclus în intrare:
Get-Process | Get-Member -MemberType Property
Aceste cunoștințe vor fi necesare pentru a rezolva problemele de administrare în mod interactiv sau pentru a vă scrie propriile scripturi: de exemplu, pentru a obține informații despre procesele suspendate folosind proprietatea Responding.
Filtrarea obiectelor
PowerShell permite ca obiectele care îndeplinesc o anumită condiție să fie trecute printr-o conductă:
Where-Object { блок сценария }
Rezultatul executării blocului de script între paranteze trebuie să fie o valoare booleană. Dacă este adevărat ($true), obiectul care este introdus în cmdletul Where-Object va fi trecut de-a lungul conductei, în caz contrar ($false) va fi șters. De exemplu, să afișăm o listă de servicii Windows Server oprite, de ex. cei a căror proprietate Status este setată la „Oprit”:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Aici vedem din nou o reprezentare textuală, dar dacă doriți să înțelegeți tipul și structura internă a obiectelor care trec prin conductă, nu este dificil:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Sortarea obiectelor
Atunci când procesează prin conducte obiectele, este adesea nevoie să le sortăm. Cmdletului Sort-Object primesc numele proprietăților (chei de sortare) și returnează obiectele ordonate după valorile lor. Este ușor să sortați rezultatul proceselor care rulează în funcție de timpul petrecut CPU (proprietatea CPU):
Get-Process | Sort-Object –Property cpu
Parametrul -Property poate fi omis la apelarea cmdlet-ului Sort-Object; este utilizat implicit. Pentru sortarea inversă, utilizați parametrul -Descendent:
Get-Process | Sort-Object cpu -Descending
Selectarea obiectelor și a părților lor
Cmdletul Select-Object vă permite să selectați un anumit număr de obiecte la începutul sau la sfârșitul unei conducte folosind parametrii -First sau -Last. Cu ajutorul acestuia, puteți selecta obiecte individuale sau anumite proprietăți și, de asemenea, puteți crea obiecte noi pe baza acestora. Să vedem cum funcționează cmdletul folosind exemple simple.
Următoarea comandă afișează informații despre cele 10 procese care consumă cantitatea maximă de RAM (proprietatea WS):
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Puteți selecta doar anumite proprietăți ale obiectelor care trec prin conductă și puteți crea altele noi pe baza acestora:
Get-Process | Select-Object ProcessName, Id -First 1
Ca rezultat al funcționării conductei, vom primi un nou obiect, a cărui structură va diferi de structura returnată de cmdletul Get-Process. Să verificăm acest lucru folosind Get-Member:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Rețineți că Select-Object returnează un singur obiect (-First 1) care are doar două dintre câmpurile pe care le-am specificat: valorile lor au fost copiate din primul obiect trecut în conductă de cmdletul Get-Process. Una dintre modalitățile de a crea obiecte în scripturile PowerShell se bazează pe utilizarea Select-Object:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Folosind Select-Object, puteți adăuga proprietăți calculate obiectelor care trebuie reprezentate ca
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Să ne uităm la structura obiectelor care trec prin transportor:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
Pentru fiecare-obiect, grup-obiect și măsură-obiect
Există și alte cmdlet-uri pentru lucrul cu obiecte. Ca exemplu, să vorbim despre cele trei cele mai utile:
Pentru fiecare obiect vă permite să rulați cod PowerShell pentru fiecare obiect din conductă:
ForEach-Object { блок сценария }
Grup-Obiect grupează obiectele după valoarea proprietății:
Group-Object PropertyName
Dacă îl rulați cu parametrul -NoElement, puteți afla numărul de elemente din grupuri.
Măsură-Obiect agregează diverși parametri rezumativi în funcție de valorile câmpului obiectului în conductă (calculează suma și găsește, de asemenea, valoarea minimă, maximă sau medie):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
De obicei, cmdleturile discutate sunt folosite interactiv și sunt adesea create în scripturi.
Crearea obiectelor .NET și COM (New-Object)
Există multe componente software cu interfețe .NET Core și COM care sunt utile administratorilor de sistem. Folosind clasa System.Diagnostics.EventLog, puteți gestiona jurnalele de sistem direct din Windows PowerShell. Să ne uităm la un exemplu de creare a unei instanțe a acestei clase folosind cmdletul New-Object cu parametrul -TypeName:
New-Object -TypeName System.Diagnostics.EventLog
Deoarece nu am specificat un anumit jurnal de evenimente, instanța rezultată a clasei nu conține date. Pentru a schimba acest lucru, trebuie să apelați o metodă specială de constructor în timpul creării acesteia folosind parametrul -ArgumentList. Dacă vrem să accesăm jurnalul aplicației, ar trebui să transmitem șirul „Aplicație” ca argument constructorului:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Vă rugăm să rețineți că am salvat rezultatul comenzii în variabila $AppLog. Deși conductele sunt utilizate în mod obișnuit în modul interactiv, scrierea de scripturi necesită adesea menținerea unei referințe la un obiect. În plus, clasele de bază .NET Core sunt conținute în spațiul de nume System: PowerShell caută în mod implicit tipurile specificate în el, așa că scrierea Diagnostics.EventLog în loc de System.Diagnostics.EventLog este destul de corectă.
Pentru a lucra cu jurnalul, puteți utiliza metodele adecvate:
$AppLog | Get-Member -MemberType Method
Să presupunem că este șters de metoda Clear() dacă există drepturi de acces:
$AppLog.Clear()
Cmdletul New-Object este, de asemenea, folosit pentru a lucra cu componente COM. Există destul de multe - de la bibliotecile furnizate cu serverul de script Windows până la aplicații ActiveX, cum ar fi Internet Explorer. Pentru a crea un obiect COM, trebuie să setați parametrul -ComObject cu ProgId-ul programatic al clasei dorite:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Pentru a vă crea propriile obiecte cu o structură arbitrară, utilizarea New-Object pare prea arhaică și greoaie; acest cmdlet este folosit pentru a lucra cu componente software externe PowerShell. În articolele viitoare, această problemă va fi discutată mai detaliat. Pe lângă obiectele .NET și COM, vom explora și obiectele CIM (WMI) și ADSI.
Apelarea metodelor statice
Unele clase .NET Core nu pot fi instanțiate, inclusiv System.Environment și System.Math. Sunt
[System.Environment] | Get-Member
Pentru a vizualiza numai membri statici, apelați Get-Member cu parametrul -Static (rețineți tipul obiectului):
[System.Environment] | Get-Member -Static
Pentru a accesa proprietăți și metode statice, utilizați două puncte consecutive în loc de un punct după literal:
[System.Environment]::OSVersion
sau
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
Tastați PSCustomObject
Dintre numeroasele tipuri de date disponibile în PowerShell, merită menționat PSCustomObject, conceput pentru stocarea obiectelor cu o structură arbitrară. Crearea unui astfel de obiect folosind cmdletul New-Object este considerată o modalitate clasică, dar greoaie și depășită:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Să ne uităm la structura obiectului:
$object | Get-Member
Începând cu PowerShell 3.0, este disponibilă o altă sintaxă:
$object = [PSCustomObject]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Puteți accesa datele într-unul dintre modalitățile echivalente:
$object.Name
$object.'Name'
$value = 'Name'
$object.$value
Iată un exemplu de conversie a unui tabel hash existent într-un obiect:
$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()
Unul dintre dezavantajele obiectelor de acest tip este că ordinea proprietăților lor se poate schimba. Pentru a evita acest lucru, trebuie să utilizați atributul [ordonat]:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Există și alte opțiuni pentru crearea unui obiect: mai sus ne-am uitat la utilizarea cmdlet-ului
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Cmdletul Add-Member vă permite să adăugați nu numai proprietăți, ci și metode la un $object creat anterior, utilizând constructul „-MemberType ScriptMethod”:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Vă rugăm să rețineți că am folosit variabila $ScriptBlock de tip ScriptBlock pentru a stoca codul pentru noua metodă.
Pentru a elimina proprietăți, utilizați metoda corespunzătoare:
$object.psobject.properties.remove('Name')
Crearea propriilor clase
PowerShell 5.0 a introdus capacitatea de a defini
class MyClass
{
# тело класса
}
Acesta este un adevărat tip .NET Core, cu un corp care descrie proprietățile, metodele și alte elemente ale acestuia. Să ne uităm la un exemplu de definire a celei mai simple clase:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Pentru a crea un obiect (instanță de clasă), utilizați cmdletul
$object = New-Object -TypeName MyClass
sau
$object = [MyClass]::new()
Să analizăm structura obiectului:
$object | Get-Member
Nu uitați de domeniul de aplicare: nu vă puteți referi la un nume de tip ca șir de caractere sau de a utiliza un tip literal în afara scriptului sau modulului în care este definită clasa. În acest caz, funcțiile pot returna instanțe de clasă (obiecte) care vor fi accesibile în afara modulului sau scriptului.
După crearea obiectului, completați proprietățile acestuia:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Rețineți că descrierea clasei specifică nu numai tipurile de proprietate, ci și valorile implicite ale acestora:
class Example
{
[string]$Name = 'John Doe'
}
Descrierea unei metode de clasă seamănă cu descrierea unei funcții, dar fără a utiliza cuvântul funcție. Ca și într-o funcție, parametrii sunt transferați la metode dacă este necesar:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
#описание метода
Smile([bool]$param1)
{
If($param1) {
Write-Host ':)'
}
}
}
Acum reprezentantul clasei noastre poate zâmbi:
$object = [MyClass]::new()
$object.Smile($true)
Metodele pot fi supraîncărcate; în plus, o clasă are
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
Descrierea noastră despre lucrul cu obiecte în PowerShell nu este exhaustivă. În următoarele publicații, vom încerca să o aprofundăm cu exemple practice: al cincilea articol din serie va fi dedicat problemelor integrării PowerShell cu componente software terțe. Părțile anterioare pot fi găsite la linkurile de mai jos.
Sursa: www.habr.com