• 10/08/2020
  • 24 de minute pentru a citi
    • j
    • h
    • s
    • V

Matrice sunt o fundamentale de limbă caracteristică de cele mai multe limbaje de programare. Sunt o colecție de valori sau obiecte greu de evitat. Să aruncăm o privire atentă la matrice și la tot ceea ce eiau de oferit.,versiunea originală a acestui articol a apărut pe blogul scris de @KevinMarquette. Echipa ThePowerShell îi mulțumește lui Kevin că ne-a împărtășit acest conținut. Vă rugăm să verificați blogul său atPowerShellExplained.com.

ce este o matrice?

voi începe cu o descriere tehnică de bază a ceea ce sunt matrice și modul în care acestea sunt utilizate de cătrecele mai multe limbaje de programare înainte de a trece în alte moduri PowerShell face uz de ele.

o matrice este o structură de date care servește ca o colecție de mai multe elemente., Puteți itera peste thearray sau accesa elemente individuale folosind un index. Matricea este creată ca o bucată secvențială dememorie în care fiecare valoare este stocată chiar lângă cealaltă.

voi atinge fiecare dintre aceste detalii pe măsură ce mergem.

utilizare de bază

deoarece matricele sunt o caracteristică de bază a PowerShell, există o sintaxă simplă pentru lucrul cu Them în PowerShell.,

Crearea unui tablou

Un array gol poate fi creat prin utilizarea @()

PS> $data = @()PS> $data.count0

putem crea o matrice și semințe cu valori doar prin plasarea lor în @() paranteze.

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

această matrice are 4 elemente. Când apelăm variabila $data, vedem lista articolelor noastre. Dacă este anarray de șiruri, atunci obținem o linie pe șir.

putem declara o matrice pe mai multe linii. Virgula este opțională în acest caz și, în general, la stânga.,

$data = @( 'Zero' 'One' 'Two' 'Three')

prefer să declar matricele mele pe mai multe linii de genul acesta. Nu numai că devine mai ușor de citit cândaveți mai multe elemente, ci și mai ușor de comparat cu versiunile anterioare atunci când utilizați sourcecontrol.

Alte sintaxa

este de obicei înțeles că @() este sintaxa pentru crearea unei matrice, dar separate prin virgulă listswork cele mai multe ori.,

$data = 'Zero','One','Two','Three'

Scrie-Ieșire pentru a crea tablouri

Un mic truc demn de menționat este faptul că puteți folosi Write-Output pentru a crea rapid stringsat consola.

$data = Write-Output Zero One Two Three

Acest lucru este util pentru că nu trebuie să puneți ghilimele în jurul șirurilor atunci când parametrul acceptstrings. Nu aș face niciodată acest lucru într-un scenariu, dar este un joc corect în consolă.

accesarea elementelor

acum că aveți o matrice cu elemente în ea, poate doriți să accesați și să actualizați aceste elemente.,pentru a accesa elementele individuale, folosim parantezele cu o valoare offset începând de la 0. Acest ishow am primit primul produs în oferta noastră:

PS> $data = 'Zero','One','Two','Three'PS> $dataZero

motivul pentru Care folosim zero aici este că primul element este la început a listei, astfel încât avem de comandă al graduatorului offset de la 0 elemente pentru a ajunge la ea. Pentru a ajunge la al doilea element, va trebui să folosim o compensare de 1 toskip primul element.

PS> $dataOne

Acest lucru ar însemna că ultimul element este la offset 3.,

PS> $dataThree

Index

acum Puteți vedea de ce am ales valorile pe care le-am făcut pentru acest exemplu. Am introdus acest lucru ca un offsetpentru că este ceea ce este cu adevărat, dar acest offset este mai frecvent denumit index. Anindex care începe la 0. Pentru restul acestui articol voi numi offset un index.

trucuri index speciale

în majoritatea limbilor, puteți specifica doar un singur număr ca index și veți obține un singur element înapoi.PowerShell este mult mai flexibil. Puteți utiliza mai mulți indici simultan., Prin furnizarea unei liste deindexuri, putem selecta mai multe elemente.

PS> $dataZeroTwoThree

elementele sunt returnate în funcție de ordinea indexurilor furnizate. Dacă duplicați un index, veți obține acel element de ambele ori.

PS> $dataThreeZeroThree

putem specifica o secvență de numere cu built-in .. operator.

PS> $dataOneTwoThree

Acest lucru funcționează în sens invers prea.

PS> $dataThreeTwoOne

puteți utiliza valori negative ale indexului pentru a compensa de la sfârșit. Deci, dacă aveți nevoie de ultimul element din listă,puteți utiliza -1.,

PS> $dataThree

în afara limitelor

în majoritatea limbilor, dacă încercați să accesați un index al unui element care a trecut de sfârșitul matricei, voiar primi un tip de eroare sau o excepție. PowerShell nu returnează nimic în tăcere.

PS> $null -eq $dataTrue

nu Pot index într-o matrice nulă

Dacă variabila este $null și încercați să-l indice ca o matrice, veți obține unSystem.Management.Automation.RuntimeException excepție cu mesajulCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

Deci, asigurați-vă că matrice nu sunt $null înainte de a încerca pentru a accesa elemente din interiorul ei.

Count

matrice și alte colecții au o proprietate count care vă spune cât de multe elemente sunt în matrice.

PS> $data.count4

PowerShell 3.0 a adăugat o proprietate count la majoritatea obiectelor. puteți avea un singur obiect și se shouldgive un număr de 1.

PS> $date = Get-DatePS> $date.count1

Și $null are un număr de proprietate, cu excepția de a se întoarce 0.,

PS> $null.count0

Există unele capcane aici că voi revedea când am acoperi de verificare pentru $null sau gol arrayslater în acest articol.

Off-by-one erori

o eroare de programare comună este creată deoarece matrice începe la index 0. Erorile Off-by-one pot fiintroduse în două moduri.primul este de gândire mental doriți al doilea element și folosind un index de 2 și într-adevăr gettingthe treilea element. Sau gândindu-vă că aveți patru elemente și doriți ultimul element, astfel încât să utilizați numărapentru a accesa ultimul element.,

$data

PowerShell este perfect fericit să te las să faci asta și să-ți dau exact ce element există în index 4:$null. Ar trebui să utilizați $data.count - 1sau -1 despre care am aflat mai sus.

PS> $dataThree

aici puteți utiliza indexul -1 pentru a obține ultimul element.

PS> $dataThree

Lee Dailey, de asemenea, mi-a arătat că putem folosi $data.GetUpperBound(0) pentru a obține max indexnumber.,

PS> $data.GetUpperBound(0)3PS> $dataThree

al doilea mod cel mai frecvent este atunci când iterați lista și nu vă opriți la momentul potrivit. I ‘ llrevizit acest lucru atunci când vorbim despre utilizareafor buclă.

actualizarea elementelor

putem folosi același index pentru a actualiza elementele existente în matrice. Acest lucru ne oferă acces direct lapdați articole individuale.

$data = 'dos'$data = 'tres'

dacă încercăm să actualizăm un element care a trecut de ultimul element, atunci obținem o eroareIndex was outside the bounds of the array..

voi revedea acest lucru mai târziu când voi vorbi despre cum să faceți o matrice mai mare.,

iterație

la un moment dat, poate fi necesar să parcurgeți sau să iterați întreaga listă și să efectuați o acțiune pentru fiecare element din matrice.

conducte

matrice și conducta PowerShell sunt destinate pentru fiecare alte. Aceasta este una dintre cele mai simple căi de aproces peste aceste valori. Când treceți o matrice într-o conductă, fiecare element din interiorul matricei esteprelucrate individual.

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

Dacă nu ați văzut $PSItem înainte, știu doar că e același lucru ca $_., Puteți utiliza oriceunul deoarece ambele reprezintă obiectul curent din conductă.

bucla ForEach

ForEach bucla funcționează bine cu colecții. Folosind sintaxa:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

metoda ForEach

am tendința de a uita despre asta dar funcționează bine pentru operații simple. PowerShell vă permite tocall .ForEach() pe o colecție.

PS> $data.foreach({"Item "})Item Item Item Item 

.foreach() ia un parametru care este un bloc de script., Puteți renunța la paranteze și doarasigurați blocul de script.

$data.foreach{"Item "}

aceasta este o sintaxă mai puțin cunoscută, dar funcționează la fel. Această metodă foreach a fost adăugată înpowershell 4.0.

pentru buclă

for bucla este folosită foarte mult în majoritatea celorlalte limbi, dar nu o vedeți prea mult în PowerShell. Când o vezi, este adesea în contextul mersului pe jos o matrice.

for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}

primul lucru pe care îl facem este de a inițializa un $index și 0., Apoi adăugăm condiția ca $indexsă fie mai mică decât $data.count. În cele din urmă, specificăm că de fiecare dată când buclăm că trebuie să mărimindex cu 1. În acest caz $index++ este prescurtarea de la $index = $index + 1.

ori de câte ori utilizați o buclă for, acordați o atenție deosebită condiției. Am folosit$index -lt $data.count aici. Este ușor pentru a obține condiția ușor greșit pentru a obține un off-by-oneerror în logica ta., Folosind $index -le $data.count sau $index -lt ($data.count - 1) sunt vreodată soslightly greșit. Acest lucru ar determina rezultatul dvs. să proceseze prea multe sau prea puține elemente. Aceasta este eroarea clasică off-by-one.

bucla de comutare

aceasta este una ușor de trecut cu vederea. Dacă furnizați o matrice la o instrucțiune switch, itcheck fiecare element din matrice.

$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock

Există o mulțime de lucruri interesante pe care le putem face cu switch. Am un alt articoldedicat acestui lucru.,

  • Tot ce ai dorit vreodată să știți despre switch

Actualizarea valorilor

atunci Când matrice este o colecție de șir de caractere sau numere întregi (tipuri de valoare), uneori, poate doriți toupdate valorile din matrice ca ai buclă peste ele. Majoritatea buclelor de mai sus utilizează o variabilă înbuclă care deține o copie a valorii. Dacă actualizați acea variabilă, valoarea inițială din matrice estenu este actualizată.

excepția de la această declarație estefor buclă., Dacă vrei să mergi de-o matrice și actualizarea valuesinside, atunci for bucla este ceea ce căutați pentru.

for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}

Acest exemplu are o valoare de index, face câteva modificări, și apoi folosește același index pentru a assignit înapoi.până în prezent, singurul lucru pe care l-am plasat într-o matrice este un tip de valoare, dar Matricele pot conține șiobiecte.

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

multe cmdleturi returnează colecții de obiecte ca matrice atunci când le atribuiți unei variabile.,

$processList = Get-Process

Toate caracteristicile de bază am vorbit deja despre încă se aplică matrice de obiecte cu o fewdetails merită subliniat.

accesarea proprietăților

putem folosi un index pentru a accesa un element individual dintr-o colecție la fel ca în cazul tipurilor de valori.

PS> $dataFirstName LastName----- ----Kevin Marquette

putem accesa și actualiza proprietățile direct.,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

Array proprietăți

în mod Normal, ar trebui sa insir toata lista ca acest lucru pentru a accesa toate proprietățile:

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

cu ajutorul Select-Object -ExpandProperty cmdlet.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Dar PowerShell ne oferă posibilitatea de a solicita LastName direct. PowerShell enumeră themall pentru noi și returnează o listă curată.

PS> $data.LastNameMarquetteDoe

enumerarea încă se întâmplă, dar nu vedem complexitatea din spatele ei.,

Where-Object filtering

acesta este locul în care Where-Object vine astfel încât să putem filtra și selecta ceea ce dorim din matricebazat pe proprietățile obiectului.

PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette

putem scrie aceeași interogare pentru a obține FirstName pe care o căutăm.

$data | Where FirstName -eq Kevin

, Unde()

Tablouri au un Where() metoda pe ele, care vă permite să specificați un scriptblock pentru filtru.

$data.Where({$_.FirstName -eq 'Kevin'})

această caracteristică a fost adăugată în PowerShell 4.0.,

actualizarea obiectelor în bucle

cu tipuri de valori, singura modalitate de a actualiza matricea este să folosim o buclă for, deoarece trebuie să știemindex pentru a înlocui valoarea. Avem mai multe opțiuni cu obiecte, deoarece sunt tipuri de referință. Aici este un exemplu rapid:

foreach($person in $data){ $person.FirstName = 'Kevin'}

Această buclă este de mers pe jos în fiecare obiect în $data matrice. Deoarece obiectele sunt tipuri de referință, variabila$person face referire la exact același obiect care este în matrice. Deci, actualizări la itsproperties actualiza originalul.,încă nu puteți înlocui întregul obiect în acest fel. Dacă încercați să atribuiți un obiect nou variabilei$person, actualizați referința variabilei la altceva care nu mai indică obiectul original din matrice. Acest lucru nu funcționează așa cum v-ați aștepta:

foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}

operatori

operatorii din PowerShell lucrează și pe matrice. Unele dintre ele funcționează puțin diferit.

-Alăturați-vă

-join operatorul este cel mai evident, așa că să ne uităm mai întâi la el., Îmi place operatorul -join și îl folosesc des. Se alătură tuturor elementelor din matrice cu caracterul sau șirulspecificați.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4

Una dintre caracteristicile care-mi place despre -join operatorul care se ocupă de elemente unice.

PS> 1 -join '-'1

eu folosesc acest lucru în interiorul logare și mesaje verbose.

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

-Alăturați-vă $array

Iată un truc inteligent pe care Lee Dailey mi l-a subliniat., Dacă vrei vreodată să se alăture everythingwithout un delimitator, în loc de a face acest lucru:

PS> $data = @(1,2,3,4)PS> $data -join $null1234

puteți folosi -join cu matrice ca parametru fără prefix. Uitați-vă la acest exemplu pentrua se vedea că vorbesc despre.

PS> $data = @(1,2,3,4)PS> -join $data1234

-înlocuiți și -split

alte operatorii, cum ar fi -replace și -split executa pe fiecare element din matrice. Nu pot spune că le-am folosit vreodată în acest fel, dar aici este un exemplu.,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

-conține

-contains operator vă permite să verificați o serie de valori pentru a vedea dacă acesta conține o durata specificată.

PS> $data = @('red','green','blue')PS> $data -contains 'green'True

în

atunci Când aveți o singură valoare care le-ar dori pentru a verifica dacă se potrivește cu una din mai multe valori, utilizați -in operator. Valoarea ar fi în partea stângă și matricea din partea dreaptăoperator.

PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue

Acest lucru poate deveni scump dacă lista este mare. Folosesc adesea un model regex dacă verific mai mult decâtcâteva valori.,

PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue

-eq și-ne

egalitatea și matricele se pot complica. Când matricea este în partea stângă, fiecare element devineîn comparație. În loc să returneze True, returnează obiectul care se potrivește.

PS> $data = @('red','green','blue')PS> $data -eq 'green'green

când utilizați operatorul-ne, obținem toate valorile care nu sunt egale cu valoarea noastră.

PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue

atunci Când utilizați acest lucru într-un if() declarație, valoarea returnată este un True valoare., Dacă nu este returnată nicio valoare, atunci este o valoare False. Ambele declarații următoare evaluează la True.

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

voi revedea aceasta într-un moment când vorbim despre testarea pentru $null.

-meci

-match operatorul încearcă să se potrivească fiecare element din colecție.

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

atunci Când utilizați -match cu o singură valoare, o variabilă special $Matches va fi completat cu matchinfo., Acesta nu este cazul când o matrice este procesată în acest fel.

putem lua aceeași abordare cu Select-String.

$servers | Select-String SQL

am să ia o privire mai atentă la Select-String,-match și $matches variabilă într-un alt post denumită multe moduri de a folosi regex.

$null sau gol

testarea pentru $null sau matrice goale poate fi dificil. Iată capcanele comune cu matrice.

pe scurt, această afirmație pare că ar trebui să funcționeze.,

if ( $array -eq $null){ 'Array is $null'}

Dar am trecut peste cum -eq verifică fiecare element din matrice. Deci putem avea o serie de severalitems cu un singur $valoare nulă și se va evalua la $true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

acesta este de ce este o bună practică pentru a plasa $null pe partea stângă a operatorului. Acest lucru face ca acest scenariu să nu fie o problemă.

if ( $null -eq $array ){ 'Array actually is $null'}

$null array nu este același lucru ca un array gol. Dacă știți că aveți o matrice, verificațicontul de obiecte din ea., Dacă matricea este $null, numărul este 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

există încă o capcană de care trebuie să aveți grijă aici. Puteți folosi count chiar dacă aveți un singleobject, cu excepția cazului în care obiectul este un PSCustomObject. Acesta este un bug care este fixat în PowerShell 6.1.Aceasta este o veste bună, dar mulți oameni sunt încă pe 5.1 și trebuie să fie atenți la asta.

PS> $object = @{Name='TestObject'}PS> $object.count$null

Dacă ești încă pe PowerShell 5.1, puteți încheia obiect într-o matrice înainte de a verifica conta obține un număr exact.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

pentru a juca pe deplin în condiții de siguranță, verificați pentru $null, apoi verificați numărul.

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-eq

am văzut recent pe cineva întrebând Cum să verifice dacă fiecare valoare dintr-o matrice se potrivește cu o anumită valoare.Reddit user / u / bis a avut această soluție inteligentă care verifică orice valori incorecte și thenflips rezultatul.

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

adăugarea la matrice

În acest moment, începeți să vă întrebați cum să adăugați elemente într-o matrice. Răspunsul rapid este că nu puteți. o matrice este o dimensiune fixă în memorie., Dacă trebuie să-l crești sau să adaugi un singur element, atuncitrebuie să creați o nouă matrice și să copiați toate valorile din vechea matrice. Acest lucru sună ca o mulțime de muncă, cu toate acestea, PowerShell ascunde complexitatea creării noului tablou. Powershellimplementează operatorul de adăugare (+) pentru matrice.

notă

PowerShell nu implementează o operație de scădere. Dacă doriți o alternativă flexibilă la anarray, trebuie să utilizați un obiect generic List.,

Adăugare matrice

putem folosi operatorul de adăugare cu matrice pentru a crea o nouă matrice. Deci, având în vedere aceste două matrice:

$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')

le putem adăuga împreună pentru a obține o nouă matrice.

PS> $first + $secondZeroOneTwoThree

Plus este egal cu +=

putem crea o nouă matrice în loc și de a adăuga un element la o astfel de prognoze:

$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'

Doar amintiți-vă că de fiecare dată când utilizați += că ești duplicarea și crearea unei noi matrice. Thisis o nu o problemă pentru seturi de date mici, dar scalează extrem de slab.,

alocarea conductelor

puteți atribui rezultatele oricărei conducte într-o variabilă. Este o matrice dacă conține multipleitems.

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

în mod normal, atunci când ne gândim la utilizarea conductei, ne gândim la garniturile tipice PowerShell. Canleverage conducta cuforeach() declarații și alte bucle. Deci, în loc de a adăuga elemente la anarray într-o buclă, putem picătură elemente pe conducta.

$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}

Array Tipuri

în mod implicit, o serie în PowerShell este creat ca un ] tip., Acest lucru îi permite să conținăorice tip de obiect sau valoare. Acest lucru funcționează deoarece totul este moștenit de la PSObject tip.

matrice puternic tastate

puteți crea o matrice de orice tip folosind o sintaxă similară. Când creați un tablou puternic tastat, acesta poate conține numai valori sau obiecte de tipul specificat.

ArrayList

adăugarea de elemente într-o matrice este una dintre cele mai mari limitări, dar există și alte câteva colecțiipe care le putem apela pentru a rezolva această problemă.,

ArrayList este de obicei unul dintre primele lucruri la care ne gândim când avem nevoie de o matrice cu care să lucrăm mai repede. Se comportă ca o matrice obiect fiecare loc pe care avem nevoie de ea, dar se ocupă de addingitems rapid.

Iată cum creăm unArrayList și adăugăm elemente la acesta.

$myarray = ::new()$myArray.Add('Value')

apelăm la.net pentru a obține acest tip. În acest caz, folosim constructorul implicit pentrucreați-l. Apoi apelăm metoda Add pentru a adăuga un element la acesta.,

motivul pentru care folosesc la începutul liniei este de a suprima codul de retur. Some.NET apelurile fac acest lucru și pot crea o ieșire neașteptată.dacă singurele date pe care le aveți în matrice sunt șiruri de caractere, atunci aruncați o privire și la utilizareastringbuilder. Este aproape același lucru, dar are unele metode care sunt doar pentru a face față custrings. StringBuilder este special conceput pentru performanță.

este comun pentru a vedea oamenii muta la ArrayList din matrice. Dar vine dintr-un moment în care C# nu a avut suport generic., ArrayList este depreciată în suport pentru generic List

Listă Generică

Un tip generic este un tip special în C# care definește un generalizate clasă și utilizatorul specifică datele tipuri se folosește atunci când l-a creat. Deci, dacă doriți o listă de numere sau siruri de caractere, ar definethat vrei lista de int sau string tipuri.

Iată cum creați o listă pentru șiruri de caractere.

$mylist = ]::new()

sau o listă pentru numere.,

$mylist = ]::new()

putem arunca o serie existent la un astfel de listă fără a crea primul obiect:

$mylist = ]@(1,2,3)

putem scurta sintaxa cu using namespace declarație în PowerShell 5 și mai noi. Declarațiausing trebuie să fie prima linie a scriptului. Prin declararea unui spațiu de nume, PowerShelllets îl lăsați în afara tipurilor de date atunci când le referiți.

using namespace System.Collections.Generic$myList = ]@(1,2,3)

Acest lucru face ca List mult mai utilizabil.,

aveți la dispoziție o metodă similară Add. Spre deosebire de ArrayList, nu există nici o valoare întoarcere pe Add metoda deci nu trebuie să void ea.

$myList.Add(10)

și putem accesa în continuare elementele ca alte matrice.

PS> $myList10

Lista

puteți avea o listă de orice tip, dar atunci când nu știi la tipul de obiecte, puteți folosi] să le conțină.,

$list = ]::new()

Remove()

ArrayList si generic List ambele sprijin eliminarea de elemente din colecție.

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

când lucrați cu tipuri de valori, îl elimină pe primul din listă. Puteți să o apelați din nou și din nou pentru a continua să eliminați această valoare. Dacă aveți tipuri de referință, trebuie să furnizați obiectulpe care doriți să le eliminați.,

]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)

elimina metoda returneaza true dacă a fost capabil de a găsi și elimina element din colecție.

mai multe colecții

există multe alte colecții care pot fi utilizate, dar acestea sunt înlocuirile bune de matrice generice.Dacă sunteți interesat să aflați mai multe dintre aceste opțiuni, aruncați o privire la acest lucrugist thatMark Kraus pus împreună.

alte nuanțe

acum că am acoperit toate funcționalitățile majore, iată câteva lucruri pe care am vrut să le menționez înainte de a încheia acest lucru.,

matricele pre-dimensionate

am menționat că nu puteți modifica dimensiunea unei matrice odată ce a fost creată. Putem crea o matrice deo dimensiune predeterminată apelând-o cu constructorul new($size).

$data = ]::new(4)$data.count4

Multiplicare matrice

Un mic truc interesant este că puteți înmulți o matrice cu un număr întreg.

PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue

inițializați cu 0

un scenariu comun este că doriți să creați o matrice cu toate zerourile. Dacă veți avea doarintegers, o matrice puternic tastată de numere întregi este implicită la toate zerourile.,

PS> ]::new(4)0000

putem folosi trucul de multiplicare pentru a face acest lucru.

PS> $data = @(0) * 4PS> $data0000

lucrul frumos despre trucul de multiplicare este că puteți utiliza orice valoare. Deci, dacă ar fi mai degrabăaveți 255 ca valoare implicită, aceasta ar fi o modalitate bună de a face acest lucru.

PS> $data = @(255) * 4PS> $data255255255255

matricele imbricate

o matrice din interiorul unei matrice se numește matrice imbricată. Nu le folosesc mult în PowerShell, dar le-am folosit mai mult în alte limbi. Luați în considerare utilizarea unei matrice de matrice atunci când datele se încadrează într-un model gridlike.,iată două moduri în care putem crea o matrice bidimensională.

$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))

virgula este foarte importantă în aceste exemple. Am dat un exemplu anterior de matrice normalămai multe linii în care virgula era opțională. Nu este cazul cu o matrice multidimensională.

modul în care folosim notația indexului se schimbă ușor acum că avem o matrice imbricată. Folosind$data de mai sus, așa vom accesa valoarea 3.

PS> $outside = 0PS> $inside = 2PS> $data3

adăugați un set de paranteze pentru fiecare nivel de matrice cuiburi., Primul set de paranteze este pentru matricea cea mai exterioară și apoi lucrați de acolo.

Write-Output-NoEnumerate

PowerShell îi place să desfacă sau să enumere matrice. Acesta este un aspect de bază al modului în care PowerShell utilizeazăpipeline, dar există momente în care nu doriți să se întâmple asta.

i frecvent obiecte țeavă la Get-Member pentru a afla mai multe despre ele. Când am țeavă o matrice la ea, itgets unwrapped și Get-membru vede membrii matrice și nu matrice reală.,

PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...

pentru a preveni desfacerea matricei, puteți utiliza Write-Object -NoEnumerate.

PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...

am un al doilea mod care este mai mult un hack (și încerc să evit hack-urile de genul acesta). Puteți plasa acomma în fața matrice înainte de țeavă.

PS> ,$data | Get-MemberTypeName: System.Object...

returnați o matrice

această despachetare a matricelor se întâmplă și atunci când ieșiți sau returnați valori dintr-o funcție. Puteți obține încă o matrice dacă atribuiți ieșirea unei variabile, astfel încât aceasta nu este de obicei o problemă.captura este că aveți o nouă matrice., Dacă aceasta este vreodată o problemă, puteți utilizaWrite-Output -NoEnumerate $arraysau return ,$array pentru a rezolva problema.

altceva?