Bazele PowerShell: Obiecte personalizate

Windows PowerShell este un mediu de comandă-shell care suportă scripting orientat pe obiecte bazat pe Microsoft .NET Framework. În centrul său se află cmdlet-ul PowerShell, o comandă ușoară care execută o acțiune specifică și, în acest proces, returnează un obiect .NET. PowerShell vă permite să utilizați cmdlet-uri pentru a accesa o varietate de sisteme și pentru a efectua numeroase sarcini împotriva acestor sisteme. Cu toate acestea, cmdlet-urile singure nu sunt întotdeauna suficiente pentru a efectua anumite acțiuni. Pentru aceste acțiuni, trebuie adesea să vă creați propriile obiecte bazate pe clasele .NET. Un tip de obiect .NET pe care îl puteți crea este obiectul personalizat. Un obiect personalizat vă permite să definiți tipurile de date atribuite obiectului respectiv și acțiunile pe care le poate efectua. După ce înțelegeți cum să construiți un obiect personalizat, veți avea un instrument puternic pentru crearea de scripturi care pot extinde raza de acțiune deja semnificativă a PowerShell.

Rețineți că .NET Framework și programarea orientată pe obiecte sunt subiecte complexe, care depășesc cu mult domeniul de aplicare de aici. Pentru a aprecia pe deplin natura orientată pe obiecte a PowerShell, poate fi util să aveți cel puțin o înțelegere de bază a acestor concepte. Pentru mai multe informații despre .NET Framework, consultați articolul MSDN „Overview of the .NET Framework”. Pentru o introducere în programarea orientată pe obiecte, consultați articolul MSDN „Programarea orientată pe obiecte (C# și Visual Basic).”

Crearea unui obiect personalizat

Pentru a crea un obiect personalizat în PowerShell, trebuie să utilizați mai întâi cmdlet-ul New-Object pentru a crea obiectul inițial. Acest cmdlet vă permite să creați obiecte .NET sau COM dintr-un sortiment de clase. Un obiect personalizat este un tip special de obiect .NET bazat fie pe clasa Object, fie pe clasa .NET PSObject. Nu există nicio diferență între cele două la crearea obiectului inițial. Cu toate acestea, clasa PSObject este în general preferată din cauza problemelor care pot apărea atunci când se adaugă proprietăți la un obiect bazat pe clasa Object, așa că să folosim PSObject.

Pentru a crea un obiect bazat pe clasa PSObject, trebuie să utilizați cmdlet-ul New-Object cu parametrul -TypeName și să specificați clasa PSObject ca valoare a parametrului, astfel:

$system = New-Object -TypeName PSObject

Când executați această comandă, aceasta va genera un obiect PSCustomObject și îl va atribui variabilei $system. De cele mai multe ori, veți dori să atribuiți obiectul unei variabile, astfel încât să puteți lucra cu ușurință cu membrii obiectului respectiv. Membrii sunt componentele care alcătuiesc un obiect, cum ar fi proprietățile, metodele, proprietățile alias și seturile de membri.

Când lucrați cu obiecte în PowerShell, cele două tipuri de membri pe care le veți folosi probabil sunt proprietățile și metodele. O proprietate descrie un aspect specific al obiectului. De exemplu, unul dintre membrii clasei FileInfo .NET este proprietatea Length, care furnizează dimensiunea unui fișier în bytes. Dacă creați un obiect FileInfo bazat pe această clasă, puteți utiliza proprietatea Length pentru a accesa dimensiunea fișierului asociat cu acel obiect. O metodă execută o acțiune legată de obiect. De exemplu, clasa FileInfo include, de asemenea, metoda Delete, pe care o puteți utiliza pentru a șterge fișierul reprezentat de obiect.

Puterea de a identifica cu ușurință membrii unui obiect facilitează lucrul cu acel obiect. Pentru a obține o listă a membrilor care compun un obiect, puteți utiliza cmdlet-ul Get-Member. De exemplu, pentru a vedea membrii noului obiect care a fost atribuit variabilei $system, puteți direcționa variabila $system către cmdlet Get-Member:

$system | Get-Member

După cum arată figura 1, obiectul pe care l-ați creat se bazează pe clasa System.Management.Automation.PSCustomObject, care include doar un număr mic de membri, toți fiind metode. Dar acesta este motivul pentru care se numește obiect personalizat – îl puteți personaliza prin adăugarea propriilor membri.

Figura 1: Lista de membri ai noului obiect

Înainte de a vă arăta cum să adăugați membri, permiteți-mi să adaug că, la fel ca multe clase .NET, clasa PSCustomObject include, de asemenea, un număr de membri ascunși de diferite tipuri, cum ar fi memberset și codeproperty. Puteți vizualiza acești membri prin includerea parametrului -Force atunci când apelați cmdlet-ul Get-Member. Deși o discuție despre membrii ascunși depășește domeniul de aplicare aici, s-ar putea să considerați utilă, la un moment dat, explorarea membrilor ascunși disponibili pentru clasa PSCustomObject și pentru alte clase .NET, pentru a profita din plin de obiectele PowerShell.

Adaugarea de proprietăți la un obiect personalizat

Un obiect personalizat este la fel de util ca și membrii asociați cu obiectul. Puteți adăuga mai multe tipuri diferite de membri la un obiect personalizat. Pentru acest exemplu, veți adăuga membrii NoteProperty și ScriptMethod. Un membru NoteProperty este asemănător cu o proprietate obișnuită, iar un membru ScriptMethod este asemănător cu o metodă obișnuită. Nu puteți adăuga o proprietate sau o metodă obișnuită la un obiect personalizat, motiv pentru care veți utiliza NoteProperty și ScriptMethod. (Pentru informații despre membrii suportați într-un obiect personalizat, consultați subiectul PowerShell TechNet „Add-Member.”)

Să începem cu adăugarea a câtorva membri NoteProperty la obiectul $system. Pentru a adăuga membrii, puteți utiliza cmdlet-ul Add-Member pentru a defini numele și valorile proprietăților. De exemplu, să presupunem că doriți să adăugați proprietăți de note pe baza datelor recuperate prin intermediul capabilităților Windows Management Instrumentation (WMI) încorporate în PowerShell. (WMI oferă o infrastructură pentru gestionarea datelor și operațiunilor în sistemele de operare Windows). Modelul de obiecte WMI include numeroase clase care acceptă o gamă largă de operații de gestionare. De exemplu, clasa Win32_OperatingSystem oferă acces la informații cum ar fi numele sistemului de operare instalat pe un computer și cel mai recent service pack aplicat acelui sistem de operare.

Pentru a crea un obiect WMI, utilizați cmdlet Get-WmiObject și specificați clasa dorită. De exemplu, pentru a crea un obiect WMI Win32_OperatingSystem și a-l atribui variabilei $os, veți utiliza codul:

$os = Get-WmiObject Win32_OperatingSystem

În acest caz, recuperați informații de sistem de la computerul local, dar frumusețea WMI este capacitatea sa de a accesa și gestiona, de asemenea, computere Windows la distanță.

Puteți utiliza apoi variabila $os pentru a accesa informațiile returnate de acel obiect. Atribuirea unui obiect unei variabile în acest mod blochează datele în acel moment. De exemplu, dacă un nou service pack este aplicat sistemului de operare după ce ați creat variabila $os, proprietatea CSDVersion a obiectului nu va reflecta modificarea deoarece obiectul fusese creat pe baza datelor originale.

După definirea variabilei $os, trebuie să specificați două comenzi Add-Member. Fiecare comandă va primi patru parametri:

  • -InputObject. Utilizați parametrul -InputObject pentru a identifica obiectul care primește noile proprietăți ale notei. În acest caz, trebuie să specificați obiectul $system.
  • -MemberType. Parametrul -MemberType indică tipul de membru care trebuie creat, deci trebuie să specificați NoteProperty.
  • -Name. Se utilizează parametrul -Name pentru a specifica numele noului membru. Pentru acest exemplu, să numim primul membru OperatingSystem și al doilea membru ServicePack.
  • -Value. Acest parametru specifică valoarea membrului. Pentru proprietatea primei note, trebuie să specificați $os.Caption pentru a returna numele sistemului de operare. Pentru a doua proprietate a notei, trebuie să specificați $os.CSDVersion pentru a returna cel mai recent service pack aplicat sistemului de operare.

Iată cum arată cele două comenzi Add-Member:

Add-Member -InputObject $system -MemberType NoteProperty ` -Name OperatingSystem -Value $os.CaptionAdd-Member -InputObject $system -MemberType NoteProperty ` -Name ServicePack -Value $os.CSDVersion

Rețineți că am împărțit fiecare comandă Add-Member în două linii. La sfârșitul fiecărei prime linii, am inclus o bifă înapoi (`) pentru ca procesorul PowerShell să știe că trebuie să continue la următoarea linie pentru comanda completă.

După ce ați executat comenzile Add-Member, puteți apela variabila $system pentru a vizualiza conținutul acesteia:

$system

Figura 2 prezintă exemple de rezultate.

Figura 2: Conținutul variabilei $system

De asemenea, puteți utiliza variabila $system pentru a apela membri individuali. Pur și simplu specificați numele variabilei, urmat de un punct, apoi numele membrului. De exemplu, următoarea comandă returnează valoarea curentă a proprietății de notă OperatingSystem:

$system.OperatingSystem

Un avantaj al creării unui obiect personalizat este că vă permite să creați proprietăți de notă bazate pe date care provin din diferite surse, precum și o proprietate de notă a cărei valoare este un anumit șir de caractere. De exemplu, aruncați o privire la codul din lista 1, care adaugă trei noi proprietăți de notă la obiectul $system.

$mem = Get-WmiObject Win32_PhysicalMemory$disk = Get-WmiObject Win32_DiskDriveAdd-Member -InputObject $system -MemberType NoteProperty ` -Name PhysicalMemory ` -Value (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name DiskSize ` -Value (("{0:N2}" -f ($disk.Size/1GB)) + ' GB')Add-Member -InputObject $system -MemberType NoteProperty ` -Name Owner -Value "janetp"

Majoritatea elementelor din lista 1 le-ați văzut în exemplul anterior. Totuși, observați că codul creează o instanță a clasei Win32_PhysicalMemory, care este atribuită variabilei $mem, și o instanță a clasei Win32_DiskDrive, care este atribuită variabilei $disk. Două dintre proprietățile notei adăugate utilizează aceste noi obiecte WMI ca surse de date.

Prima comandă Add-Member recuperează date din proprietatea $mem.Capacity, care furnizează capacitatea memoriei de pe sistemul țintă. Cu toate acestea, în acest caz, parametrul -Value este un pic mai complex decât ați văzut în exemplul anterior. În primul rând, comanda specifică „{0:N2}” urmat de -f, care este o construcție .NET pentru formatarea numărului ieșit. Practic, aceasta specifică faptul că un număr este returnat cu două zecimale. Instrucțiunile de formatare sunt urmate de o expresie scurtă ($mem.Capacity/1GB) care împarte valoarea Capacity la 1GB. Valoarea Capacity furnizează dimensiunea memoriei în bytes. PowerShell facilitează conversia octeților în gigabytes prin simpla împărțire la 1GB. În cele din urmă, comanda etichetează șirul ‘ GB’ (inclusiv spațiul) pe ieșire și închide totul între paranteze.

Cea de-a doua comandă Add-Member urmează aceeași logică pentru a returna dimensiunea hard disk-ului computerului. Folosește proprietatea $disk.Size pentru a returna dimensiunea în octeți, apoi o convertește în gigabytes.

Cea de-a treia comandă Add-Member adaugă o proprietate de notă numită Owner și îi atribuie valoarea de șir de caractere janetp. În acest caz, „proprietar” poate însemna orice – utilizatorul principal, ultimul utilizator, administratorul sau orice altă semnificație pe care doriți să o impuneți proprietății. Am inclus-o aici doar pentru a demonstra că puteți adăuga o proprietate de notă a cărei valoare este un simplu șir de caractere.

După ce ați adăugat cei trei membri la obiectul personalizat, puteți apela din nou variabila $system. Aceasta va returna rezultate precum cele prezentate în figura 3.

Figura 3: Proprietăți de notă adăugate cu ajutorul Cmdletului Add-Member

Acum aveți un singur obiect care conține date derivate din trei obiecte WMI diferite. Obiectul conține, de asemenea, proprietatea Owner, care se bazează pe o valoare de tip string. Puteți apela acea proprietate note ca și cum ați apela orice alt membru:

$system.Owner

Cum v-ați aștepta, comanda returnează valoarea janetp. Cu toate acestea, puteți schimba acea valoare cu una diferită prin atribuirea unei noi valori proprietății, astfel:

$system.Owner = "rogert"

În acest caz, valoarea rogert a fost atribuită proprietății Owner note. Dacă apelați acum acea proprietate notă, aceasta va returna noua valoare.

Ca și în cazul multor sarcini pe care le puteți efectua în PowerShell, există o serie de moduri diferite de a adăuga un membru la un obiect personalizat. De exemplu, PowerShell 3.0 vă permite să creați un tabel hash și să treceți hash-ul la comanda New-Object. Codul din lista 2 creează aceleași cinci proprietăți ale notei, dar utilizează un tabel hash pentru a trece numele și valorile membrilor.

$info = @{ "OperatingSystem" = $os.Caption; "ServicePack" = $os.CSDVersion; "PhysicalMemory" = (("{0:N2}" -f ($mem.Capacity/1GB)) + ' GB'); "DiskSize" = (("{0:N2}" -f ($disk.Size/1GB)) + ' GB'); "Owner" = 'janetp'}$system = New-Object -TypeName PSObject -Property $info$system

Acest cod creează mai întâi un tabel hash care definește cinci perechi proprietate/valoare, fiecare corespunzând proprietăților notei. După cum arată codul, trebuie să separați perechile proprietate/valoare cu punct și virgulă. De asemenea, trebuie să închideți setul de cinci perechi proprietate/valoare între paranteze drepte și să precedați paranteza de deschidere cu simbolul at (@). În cele din urmă, trebuie să atribuiți tabelul hash la variabila $info.

După definirea tabelului hash, codul utilizează cmdlet-ul New-Object pentru a crea un obiect bazat pe clasa PSObject și îl atribuie la variabila $system. Numai că, de data aceasta, comanda include parametrul -Property, care ia ca valoare variabila $info.

În cele din urmă, codul apelează variabila $system, care returnează rezultate precum cele din figura 4. Observați ordinea în care au fost adăugate proprietățile la obiect. Una dintre problemele legate de utilizarea unui tabel hash pentru adăugarea proprietăților notei este că nu puteți controla ordinea acestora. Pentru a controla ordinea, trebuie să utilizați cmdlet-ul Add-Member pentru a adăuga fiecare membru.

Figura 4: Proprietăți de notă create cu ajutorul tabelului hash

Adaugarea de metode la un obiect personalizat

Acum că ați văzut cât de ușor este să adăugați proprietăți, să accesați valorile lor și să modificați aceste valori, să trecem la metode. Acestea devin un pic mai complicate, deoarece metodele trebuie să facă ceva și trebuie să definiți acel ceva ca parte a valorii metodei.

De exemplu, codul din Lista 3 creează o metodă care recuperează data și ora curentă și le returnează atât în formatul lor original, cât și ca valori ale Timpului Universal Coordonat (UTC).

$method ={ $a = Get-Date -Format F; "Local: " + $a; $b = Get-Date; "UTC: " + $b.ToUniversalTime().DateTime}Add-Member -InputObject $system -MemberType ScriptMethod ` -Name GetUTC -Value $method

Pentru a păstra codul lizibil, puteți atribui valoarea metodei unei variabile (de exemplu, $metodă). Această valoare include expresiile necesare pentru a returna informațiile privind data și ora. Cu toate acestea, trebuie să definiți valoarea ca un bloc de script pentru a o trece în comanda Add-Member. Pentru a face acest lucru, includeți conținutul valorii între paranteze drepte. PowerShell va atribui apoi valoarea în forma sa actuală variabilei ca obiect ScriptBlock.

În lista 3, valoarea metodei include două expresii. Prima expresie returnează data și ora curentă, iar cea de-a doua expresie returnează versiunea UTC. Începeți prima expresie prin utilizarea cmdletului Get-Date pentru a prelua data și ora curente, pe care le atribuiți variabilei $a. Rețineți că, atunci când apelați cmdlet Get-Date, trebuie să includeți parametrul -Format, împreună cu valoarea F. Acest lucru îi spune lui PowerShell să afișeze data și ora într-un format complet de dată și oră, ca în Monday, August 19, 2013 12:28:25 PM. Apoi adăugați șirul de caractere „Local: ” (inclusiv spațiul) la valoarea variabilei pentru a returna data și ora curentă împreună cu această etichetă.

În cea de-a doua expresie, începeți din nou cu cmdlet-ul Get-Date pentru a returna data și ora curentă, pe care le atribuiți variabilei $b. Folosiți apoi metoda ToUniversalTime a variabilei pentru a returna data și ora ca valoare UTC, apoi specificați proprietatea DateTime pentru a returna formatul corect.

Dacă ar fi să apelați variabila $method în acest moment, aceasta ar returna cele două expresii sub formă de șiruri de caractere, exact așa cum au fost tastate. Deoarece ați definit valoarea variabilei ca un bloc de script, comenzile nu sunt procesate atunci când sunt atribuite variabilei $method. În schimb, variabila $metodă este creată ca un obiect ScriptBlock, lucru pe care îl puteți confirma folosind metoda GetType pentru a vedea tipul variabilei:

$method.GetType()

Pentru a lucra cu blocul de script, trebuie să adăugați metoda ca membru al obiectului $system după definirea variabilei $metodă. Pentru a face acest lucru, trebuie să creați o comandă Add-Member care specifică ScriptMethod ca tip, GetUTC ca nume și variabila $method ca valoare.

După rularea codului din lista 3, puteți folosi variabila $system pentru a apela metoda GetUTC în același mod în care ați apelat proprietățile:

$system.GetUTC()

Atenție, totuși, când apelați metoda script, trebuie să includeți parantezele, la fel ca pentru orice altă metodă, chiar dacă nu treceți argumente. Metoda ar trebui să returneze acum rezultate similare cu cele din figura 5, dar cu data și ora la care ați apelat metoda.

Figura 5: Exemplu de rezultate ale metodei GetUTC()

În viața reală, probabil că veți dori să creați metode care să aibă mai multă forță. De exemplu, obiectul $system ar putea încorpora sarcini de gestionare WMI în metodele sale de script. Dacă faceți acest lucru, trebuie să testați complet metoda pentru a vă asigura că comenzile dvs. fac exact ceea ce trebuie să facă. PowerShell și WMI sunt amândouă instrumente puternice, așa că trebuie folosite cu grijă atunci când gestionați computere Windows.

Adaugarea de obiecte personalizate la o matrice

Obiectele personalizate nu se limitează la obiecte de sine stătătoare pe care le folosiți o singură dată și le aruncați deoparte. Puteți adăuga aceste obiecte la o matrice de obiecte, apoi să accesați obiectele prin intermediul acelei matrice. De exemplu, să presupunem că doriți să manipulați informațiile pe care le preluați de la mai multe calculatoare. Aceste informații ar putea include detalii despre memoria și unitățile logice disponibile pe acele sisteme. Doriți să puteți lucra cu aceste detalii într-un mod semnificativ în PowerShell. Datorită naturii orientate pe obiecte a PowerShell, punerea acelor informații în obiecte este adesea cel mai simplu mod de a lucra cu acele date.

Să ne uităm la un exemplu despre cum ați putea face acest lucru. Pentru această discuție, abordarea utilizată pentru a colecta informațiile despre diferitele calculatoare nu este importantă. Ați putea, de exemplu, să configurați o buclă foreach în PowerShell care utilizează WMI pentru a prelua informațiile de la diferitele stații de lucru. Indiferent de metoda utilizată, de dragul conciziei, să presupunem că ați colectat informațiile într-un fișier text separat prin virgulă care conține datele prezentate în figura 6.

Figura 6: Date WMI colectate

Filierul text include un rând de antet și un rând pentru unitățile logice ale fiecărui sistem. De exemplu, primul rând de date oferă detalii despre unitatea logică C de pe calculatorul ws01. Unitatea logică are o capacitate de 500 GB, cu 225 GB de spațiu liber. Sistemul are, de asemenea, 4GB de memorie. Al doilea rând indică faptul că același computer conține și unitatea logică D, care are aceeași capacitate ca și unitatea C, dar cu 320GB de spațiu liber.

Obiectivul este de a transforma fiecare rând de date în propriul său obiect personalizat, apoi de a adăuga aceste obiecte la o matrice. Puteți apoi să acționați asupra obiectelor din cadrul matricei prin direcționarea datelor către alte comenzi PowerShell. Codul din Listarea 4 definește un array gol, importă datele din fișierul text, apoi folosește o buclă foreach pentru a crea obiectele și a le adăuga la array.

$SystemInfo = @()$SourceData = Import-CSV C:\DataFiles\SourceData.txtforeach ($source in $SourceData){ $system = New-Object -TypeName PSObject $system | Add-Member -Type NoteProperty ` -Name Computer -Value $source.Computer $system | Add-Member -Type NoteProperty ` -Name DeviceID -Value $source.DeviceID $system | Add-Member -Type NoteProperty ` -Name DriveSize -Value ($source.DriveSize) $system | Add-Member -Type NoteProperty ` -Name UsedSpace ` -Value ($source.DriveSize - $Source.FreeSpace) $system | Add-Member -Type NoteProperty ` -Name FreeSpace -Value ($source.FreeSpace) $SystemInfo += $system}

După cum puteți vedea, primul pas este crearea array-ului gol (@()) și atribuirea acestuia variabilei $SystemInfo. În cele din urmă, veți adăuga obiectele personalizate la acest array.

În continuare, utilizați cmdlet-ul Import-CSV pentru a importa datele în variabila $SourceData. Pentru acest exercițiu, fișierul text se numește SourceData.txt și este salvat în folderul C:\DataFiles. cmdlet-ul Import-CSV recuperează fiecare rând ca obiect propriu, salvându-l în $SourceData. În acest moment, ați putea utiliza acea variabilă pentru a accesa datele, dar nu ați avea niciun control asupra membrilor incluși în obiect și nici nu ați putea adăuga membri.

Următorul pas, deci, este să creați o buclă foreach care vă permite să creați un obiect personalizat pentru fiecare rând din fișierul text. Condiția foreach ($source în $SourceData) specifică faptul că fiecare rând din $SourceData ar trebui să fie atribuit variabilei $source pe măsură ce codul itera prin bucla foreach. Logica definită în blocul de script foreach (inclusă între paranteze drepte) va fi executată o singură dată pentru fiecare rând, un obiect $source diferit fiind aplicat la fiecare iterație. (Pentru mai multe informații despre crearea unei bucle foreach, consultați subiectul PowerShell TechNet about_ForEach.)

Să ne uităm mai atent la blocul de script foreach. Prima comandă creează obiectul inițial și îl salvează în variabila $system, așa cum ați văzut în exemplele anterioare. Apoi, variabila $system este direcționată către o comandă Add-Member pentru a crea prima proprietate de notă. Acesta este un format ușor diferit față de cel folosit anterior. În loc să includeți parametrul -InputObject în comanda Add-Member, pur și simplu trimiteți $system la comandă. Astfel se obțin aceleași rezultate pe care le-ați văzut în exemplele anterioare de comenzi Add-Member. Am adoptat această abordare aici doar pentru a demonstra încă un mod în care PowerShell vă permite să adăugați membri.

Pentru valoarea comenzii Add-Member, utilizați variabila $source pentru a apela proprietatea Computer, care corespunde câmpului Computer din datele sursă. A doua comandă Add-Member funcționează în același mod, cu excepția faptului că recuperează datele din proprietatea DeviceID. Observați că proprietatea Memory nu este inclusă. Atunci când creați un obiect personalizat, puteți omite proprietăți specifice sau le puteți pune într-o ordine diferită.

Cea de-a treia comandă Add-Member funcționează cam în același mod ca și primele două, cu excepția faptului că accesează proprietatea DriveSize. Deoarece este posibil să doriți să lucrați cu aceste date ca valoare numerică și nu ca șir de caractere, comanda convertește în mod explicit datele într-un număr. Acest lucru se realizează precedând numele proprietății cu pentru a indica faptul că doriți tipul de dateint, apoi înglobând întreaga expresie a proprietății în paranteze.

Cea de-a patra comandă Add-Member face ceva puțin diferit. Aceasta creează un membru calculat care scade valoarea FreeSpace din valoarea DriveSize pentru a determina cantitatea de spațiu utilizat. Din nou, numele proprietății este precedat de și întreaga expresie este închisă între paranteze. Posibilitatea de a crea o proprietate calculată este unul dintre principalele motive pentru care ați putea dori să creați obiecte personalizate.

Comanda finală Add-Member funcționează la fel ca a treia, cu excepția faptului că recuperează datele din proprietatea FreeSpace.

Comanda finală din blocul de script foreach adaugă obiectul curent $system la matricea $SystemInfo. Observați că operatorul += este utilizat pentru a se asigura că noul obiect $system este adăugat la fiecare iterație a buclei, fără ca nimic să fie suprascris.

După ce executați codul din listarea 4, puteți apela variabila pentru a vizualiza conținutul acesteia. Figura 7 prezintă o listă parțială a datelor stocate acum în array-ul $SystemInfo.

Figura 7: Date stocate în array-ul $SystemInfo

În mod specific, aceasta prezintă datele pentru primele șapte obiecte din array, care corespund primelor șapte rânduri de date din fișierul text original. Fiecare grupare reprezintă unul dintre obiectele adăugate în array-ul $SystemInfo. Puteți verifica dacă ați creat un tablou de obiecte utilizând metoda GetType pentru a prelua tipul variabilei:

$SystemInfo.GetType()

Dacă această comandă returnează un BaseType de System.Array, variabila $SystemInfo este într-adevăr un tablou de obiecte capabil să conțină obiecte personalizate. Puteți utiliza apoi această variabilă pentru a manipula datele așa cum credeți de cuviință. De exemplu, puteți direcționa variabila către o comandă Sort-Object pentru a sorta datele în ordine descrescătoare, pe baza valorilor FreeSpace:

$SystemInfo | Sort FreeSpace -Descending

În acest caz, comanda utilizează aliasul Sort pentru a face referire la cmdlet-ul Sort-Object și include proprietatea FreeSpace și parametrul -Descending. După cum puteți vedea în figura 8, obiectele sunt acum listate în funcție de valorile FreeSpace, cu cea mai mare cantitate de spațiu liber listată prima. Încă o dată, aceasta este doar o listă parțială.

Figura 8: Date ordonate în funcție de cantitatea de spațiu liber

De asemenea, puteți sorta datele pe baza mai multor coloane. De exemplu, ați putea sorta datele mai întâi după proprietatea Computer, apoi după proprietatea FreeSpace, în ordine descrescătoare:

$SystemInfo | Sort Computer, FreeSpace -Descending

Așa cum v-ați aștepta, rezultatele sunt acum mult diferite, după cum arată figura 9.

Figura 9: Date sortate după numele Computer și cantitatea de spațiu liber în ordine descrescătoare

Una dintre consecințele sortării coloanelor în acest mod este că valorile Computer, precum și valorile FreeSpace sunt sortate în ordine descrescătoare. Cmdlet-ul Sort-Object nu vă permite să sortați cu ușurință o coloană în ordine crescătoare și o alta în ordine descrescătoare. Dacă specificați parametrul -Descending, toate datele sunt sortate în această ordine. Cu toate acestea, puteți ocoli această limitare prin crearea de expresii pentru fiecare proprietate care să specifice modul de sortare a acestor valori. De exemplu, următoarea comandă sortează mai întâi după proprietatea Computer în ordine crescătoare, apoi după proprietatea FreeSpace în ordine descrescătoare:

$SystemInfo | Sort ` @{Expression="Computer"; Descending=$false}, @{Expression="FreeSpace"; Descending=$true}

Prima expresie Sort-Object setează proprietatea Expression la Computer și proprietatea Descending la $false. A doua expresie stabilește proprietatea Expression la FreeSpace și proprietatea Descending la $true. (Variabilele $true și $false sunt variabile de sistem încorporate care furnizează valorile booleene adevărate și false de 1 și, respectiv, 0). Apoi trebuie să închideți fiecare expresie între paranteze drepte și să precedați fiecare paranteză de deschidere cu simbolul at (@). Acum datele vor fi sortate în ordinea dorită, așa cum se arată în figura 10.

Figura 10: Date sortate după numele calculatorului în ordine crescătoare și după cantitatea de spațiu liber în ordine descrescătoare

Aceasta poate părea o exagerare pe tema sortării, dar arată flexibilitatea lucrului cu obiecte într-un array. Și cu siguranță nu sunteți limitat la cmdlet Sort-Object. De exemplu, următoarea comandă direcționează variabila $SystemInfo către cmdlet Where-Object:

$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending

În acest caz, comanda utilizează aliasul Where pentru a face referire la cmdlet-ul Where-Object. În plus, se specifică faptul că valoarea DriveSize trebuie să fie mai mare de 250 pentru a fi inclusă în rezultate. (În PowerShell, -gt este utilizat pentru operatorul mai mare decât.) Rezultatele care îndeplinesc aceste criterii sunt direcționate către cmdlet Sort-Object, astfel încât datele să fie afișate în ordinea corectă.

Puteți direcționa chiar și datele sortate către o comandă Select-Object, ca aceasta:

$SystemInfo | Where DriveSize -gt 250 | Sort FreeSpace -Descending | Select -First 5

Acestă comandă utilizează cmdlet Select-Object (la care se face referire prin aliasul Select) pentru a returna numai primele cinci rânduri din setul de rezultate. După cum puteți vedea, odată ce adăugați obiecte personalizate la matricea $SystemInfo, aveți o varietate de opțiuni pentru a lucra cu aceste obiecte.

Să profitați la maximum de obiectele dvs. personalizate

În cea mai mare parte, crearea de obiecte personalizate în PowerShell este un proces destul de simplu. Dacă există vreo complexitate implicată, aceasta provine, în general, din expresiile de valoare pe care le definiți pentru proprietățile notei dvs. sau metodele de script. Expresiile din aceste exemple sunt relativ simple în comparație cu tipurile de expresii pe care le puteți crea în PowerShell. Chiar și așa, ceea ce ați văzut aici ar trebui să vă ofere baza de care aveți nevoie pentru a crea obiecte personalizate. Atunci când sunt utilizate în mod eficient, acestea pot fi o componentă puternică a scripturilor PowerShell, indiferent dacă creați obiecte individuale, le adăugați la o matrice sau le folosiți în alt mod. Ați putea, de exemplu, să creați obiecte personalizate în cadrul profilului PowerShell, astfel încât acestea să fie disponibile de fiecare dată când începeți o nouă sesiune. Modul în care utilizați obiectele personalizate în scripturile dumneavoastră depinde de dumneavoastră. Trebuie doar să știți că obiectul personalizat este un instrument eficient și flexibil care poate servi multora dintre nevoile dumneavoastră de scripting.

Pentru informații suplimentare despre crearea de obiecte personalizate în Windows PowerShell, consultați cartea lui Bill Stewart „Creating Custom Objects in Windows PowerShell.”

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.