de multe ori când scrieți scripturi PowerShell, aveți nevoie de o modalitate de a stoca un set de elemente. O modalitate comună de a realiza acest lucru este cu o matrice sau un tip specific cunoscut sub numele de ArrayList. Dar ce este o matrice oricum? O matrice este o structură de date care este proiectat pentru a stoca o colecție de elemente. Aceasta poate include atât aceleași, cât și diferite tipuri de articole.
matricele sunt utilizate în multe limbaje de programare diferite, iar PowerShell nu este diferit. Există multe modalități de a crea, manipula și optimiza matrice., În acest articol veți afla despre ArrayLists, Arrays și colecții, precum și câteva bune practici atunci când le aplicați cu PowerShell.
cuprins
cerințe preliminare/cerințe
deoarece veți lucra doar cu limba PowerShell în sine, nu există condiții prealabile pentru mediu. Trebuie doar să aveți un PC Windows cu PowerShell. Mai precis:
- Windows PowerShell 3 sau mai târziu
- .NET Framework 4.5 sau mai târziu
Vrei mai multe sfaturi de genul asta?, Check out meu personal PowerShell blog la: https://nkasco.com/FriendsOfATA
Crearea de Tablouri cu PowerShell
Există multe moduri diferite de a crea tablouri cu PowerShell. Să presupunem că aveți o listă de nume pe care trebuie să le procesați cumva, așa cum se arată mai jos.
JohnSusieJimJohnnyCarrie
construirea matrice prin elemente separate prin virgulă
modul cel mai de bază puteți crea un tablou este de a atribui pur și simplu intrări cunoscute, separate prin virgulă, la o variabilă așa cum se arată mai jos.,
$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"
Dacă tu a alerga GetType()
metoda disponibil pe toate obiectele în PowerShell, veți vedea că ați creat cu succes o serie cum este indicat de către BaseType
proprietatea se arată mai jos.
PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array
folosind operatorul de sub-Expresie
puteți crea, de asemenea, tablouri în PowerShell printr-un operator de sub-Expresie. Acest concept este utilizat în mod obișnuit atunci când nu știți câte elemente vor fi adăugate în matricea dvs. Rezultatul poate conține zero sau multe elemente atunci când este creat.,
observați mai jos un tablou numit $MyArray
a fost creat cu elemente zero în interior.
#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0
folosind operatorul de interval
matricele nu sunt doar retrogradate la stocarea șirurilor așa cum se arată mai sus. De asemenea, puteți crea tablouri cu alte tipuri de obiecte, cum ar fi numere întregi.
Dacă aveți nevoie de o serie de numere întregi în ordine secvențială, puteți lua o comandă rapidă și puteți utiliza intervalul ..
operator. Mai jos puteți vedea o matrice a fost creat cu numere întregi 2 până la 5 cu o singură linie de cod.,
PS51> $NumberedArray = 2..5PS51> $NumberedArray2345
crearea colecțiilor PowerShell ArrayList
folosind un PowerShell ArrayList este, de asemenea, o modalitate prin care puteți stoca o listă de articole cu PowerShell. Clasa ArrayList face parte din sistem.Colecții spațiu de nume în cadrul. NET. prin crearea unui nou obiect de acest tip, puteți stoca apoi obiecte într-un ArrayList.
mai jos puteți vedea că trebuie să creați în mod explicit un obiect ArrayList folosind New-Object
cmdlet sau prin turnarea unui tablou standard la un obiect ArrayList.,
Observați că în acest caz BaseType
este un obiect întrucât exemplele de mai sus au BaseTypes de Tablouri care prezintă moștenire de la clasa Object. În cele din urmă, PowerShell oferă acces la sistemul de tip.net.
adăugarea elementelor într-o matrice
când creați o matrice, puteți fie să definiți toate elementele la momentul creării, fie să le adăugați ad-hoc.pentru a adăuga elemente într-o colecție existentă, puteți utiliza operatorul +=
sau metoda Add
. Dar știu că există diferențe majore în modul în care acestea funcționează.,
atunci Când creați un standard de matrice cu @()
, vei folosi +=
operator dar pentru a adăuga elemente la un ArrayList, v-ar folosi Add
metoda. Aceste metode diferă prin faptul că operatorul +=
distruge efectiv matricea existentă și creează una nouă cu elementul nou.
pentru a demonstra, veți vedea mai jos puteți face referire la IsFixedSize
proprietate pentru o matrice sau ArrayList să știe care este imuabil și care nu este.,
PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse
deoarece o matrice de bază este o colecție de dimensiuni fixe, nu o puteți modifica.
încercarea de a utiliza metoda Add()
cu o matrice care are o dimensiune fixă va duce la o eroare din cauza dimensiunii fixe. Mai jos puteți vedea câteva exemple în care puteți adăuga cu succes elemente într-o matrice.
#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"
Eliminarea de Elemente Dintr-O Matrice
Acum, că aveți o mai bună înțelegere a modului de a adăuga elemente într-o matrice, să acopere câteva moduri în care puteți elimina elemente dintr-o matrice.,deoarece o matrice de bază este fixă, nu puteți elimina elemente din ele. În schimb, trebuie să creați o matrice complet nouă. De exemplu, puteți elimina un singur element dintr-un tablou creând o instrucțiune condiționată care se potrivește numai cu acele elemente pe care doriți să le includeți. Un exemplu este prezentat mai jos.
$NewBasicArray = $BasicArray -ne "Nate"
De un ArrayList nu este fix, puteți elimina elemente dintr-le folosind Remove()
metoda. Acesta este un scenariu în care utilizarea unui ArrayList vă poate beneficia dacă intenționați să adăugați/eliminați frecvent elemente.,
$MyArrayList.Remove("Nate")
preluarea elemente specifice dintr-o matrice sau ArrayList
pentru a prelua elemente specifice dintr-o matrice sau ArrayList puteți utiliza mai multe metode diferite. La fel ca alte obiecte din PowerShell, puteți accesa toate elementele unei matrice prin simpla apelare a obiectului.
PS51> $BasicArrayJohnSusieJimJohnnyCarrie
poate că trebuie să preluați doar primul element, matricele vor avea întotdeauna o origine de 0 reprezentând primul element al matricei. Pentru a prelua primul element al unui tablou, specificați numărul indexului între paranteze, după cum se arată mai jos.,
PS51> $BasicArrayJohn
invers, puteți, de asemenea, indexurile de referință înapoi folosind o liniuță (indicator negativ) pentru a apela ultimul număr X de elemente din matrice. Un mod comun de a găsi ultimul element într-o matrice este folosind -1
așa cum se arată mai jos.
PS51> $BasicArrayCarrie
operatorul de gamă despre care ați aflat mai sus poate fi, de asemenea, utilizat pentru a prelua obiecte dintr-o matrice urmând aceeași metodă de apelare a elementelor. Să presupunem că doriți să preluați primele patru nume din matricea $BasicArray
.,
puteți vedea mai jos puteți specifica o serie de indici 0-3 care vor returna primele patru elemente.
PS51> $BasicArrayJohnSusieJimJohnny
Optimizarea Tablouri cu PowerShell
Acum, că aveți o bună bază de modul de a crea și manipula tablouri, care ar trebui să utilizați? Pentru a răspunde la aceasta, să parcurgem câteva exemple cu Measure-Command
cmdlet. Folosind cmdlet-ulMeasure-Command
, veți înțelege mai bine cât timp durează comenzile pentru a procesa elementele pe măsură ce sunt transmise pe conductă.,în general, dacă aveți o mică colecție de obiecte, probabil că nu veți observa prea multe diferențe cu modul în care vă manipulați matricele. Cu toate acestea, dacă aveți o colecție mare de obiecte, este important să înțelegeți diferențele pentru a obține rezultate optime.
Să aplicați ceea ce ați învățat în secțiunea anterioară despre diferența dintre +=
și folosind Add()
metoda cu o buclă de 50.000 de articole.
Mai întâi, creați un tablou gol și un tablou gol, așa cum se arată mai jos.,
PS51> $MyArray = @()PS51> $MyArrayList = @()
apoi, populați 50.000 de elemente în fiecare colecție folosind operatorul de interval și o buclă foreach așa cum se arată mai jos.
@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})
în cele din Urmă, folie de comenzi într-o expresie și expresie Measure-Command
cmdlet. Prin executarea expresiei cu Measure-Command
, puteți vedea cât timp durează de fapt fiecare proces pentru a executa.
Țineți minte că, așa cum ați învățat înainte,
+=
de fapt, creează o nouă matrice, mai degrabă decât adăugarea la unul fix.,
rezultatul? Aproape 60 de secunde față de 139 de milisecunde!după cum puteți vedea, este mult mai rapid să utilizați un ArrayList pentru colecții mari, mai degrabă decât să utilizați o matrice de dimensiuni fixe.deși acesta este un exemplu de bază, subliniază importanța înțelegerii a ceea ce face codul dvs. în timpul procesării. Dacă nu este înțeles corect, poate duce la o experiență slabă a utilizatorului.,
Dacă aveți orice script existent care ar putea beneficia de ajutorul unui ArrayList, mai degrabă decât un tablou, aceasta va prezenta o oportunitate fantastica de a face o noapte de îmbunătățire!
bibliografie
- Compararea tablouri cu PowerShell
- Cum de A Crea Tablouri de Performanță în PowerShell (MCPmag)
Vrei mai multe sfaturi de genul asta? Consultați blogul meu personal PowerShell la: https://nkasco.com/FriendsOfATA.