matricele sunt o caracteristică fundamentală a limbajului majorității limbajelor de programare. Ele sunt o colecție de valori sau obiecte și, prin urmare, sunt greu de evitat. Să aruncăm o privire atentă la matrice și tot ce au de oferit.
- indexul paginii
- ce este o matrice?,meci
- Toate -eq
- Array plus
- Plus este egal cu +=
- Conducte misiune
- Puternic tastat matrice
- ArrayList
- Listă Generică
- Lista
- Remove()
- Mai multe colecții
- Pre-dimensiuni matrice
- Multiplicare matrice
- Inițializa cu 0
- tablouri Imbricate
- Scrie-Ieșire -NoEnumerate
- Returneze un array
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 cele 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 matrice sau accesa elemente individuale folosind un index. Matricea este creată ca o bucată secvențială de memorie î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 a lucra cu ele în PowerShell.
de a Crea o matrice cu @()
Un array gol poate fi creat prin utilizarea @()
PS> $data = @() PS> $data.count 0
putem crea o matrice și semințe cu valori doar prin plasarea lor în @()
paranteze.
PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three
această matrice are 4 elemente. Când apelăm variabila $data
, vedem lista articolelor noastre., Dacă este o serie de șiruri, atunci vom avea o linie pe șir.
putem declara o matrice pe mai multe linii. Virgula este opțională în acest caz și, în general, lăsată afară.
$data = @( 'Zero' 'One' 'Two' 'Three' )
prefer să declar matricele mele pe mai multe linii de genul acesta. Nu numai că este mai ușor de citit atunci când aveți mai multe elemente, ci și mai ușor de comparat cu versiunile anterioare atunci când utilizați controlul sursei.,
altă sintaxă
se înțelege de obicei că @()
este sintaxa pentru crearea unui tablou, dar listele separate prin virgulă funcționează de 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 siruri de caractere la 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 acceptă șiruri., 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 elemente individuale, folosim parantezele cu o valoare offset începând de la 0. Acest lucru este cum vom ajunge primul element din matrice noastre:
PS> $data = 'Zero','One','Two','Three' PS> $data Zero
motivul pentru Care folosim zero aici este că primul element la începutul listei, deci vom folosi un offset de 0 elemente pentru a ajunge la ea., Pentru a ajunge la al doilea element, va trebui să folosim o compensare de 1 pentru a sări peste primul element.
PS> $data One
acest lucru ar însemna că ultimul element este la offset 3.
PS> $data Three
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 offset, deoarece că este ceea ce este cu adevărat, dar acest offset este mai frecvent menționată ca un index. Un index care începe la 0
. Pentru restul acestui articol voi numi offset un index.,
trucuri speciale pentru index
în majoritatea limbilor, puteți specifica doar un singur număr ca index și veți primi un singur element înapoi. PowerShell este mult mai flexibil. Puteți utiliza mai mulți indici simultan. Prin furnizarea unei liste de indexuri, putem selecta mai multe elemente.
PS> $data Zero Two Three
elementele vor fi returnate în funcție de ordinea indexurilor furnizate. Dacă duplicați un index, veți primi acel element de ambele ori.,
PS> $data Three Zero Three
putem specifica o secvență de numere cu construit în ..
operator.
PS> $data One Two Three
Acest lucru funcționează în sens invers prea.
PS> $data Three Two One
puteți utiliza valorile indexului negitiv pentru a compensa de la sfârșit. Deci, dacă aveți nevoie de ultimul element din listă, puteți utiliza -1
.,
PS> $data Three
în afara limitelor
în majoritatea limbilor, dacă încercați să accesați un index al unui element care este trecut de sfârșitul matricei, veți obține un tip de eroare sau o excepție. PowerShell nu vă va oferi nimic în tăcere.
PS> $null -eq $data True
nu Pot index într-o matrice nulă
Dacă variabila este $null
și încercați să-l indice ca o matrice, vei primi un System.Management.Automation.RuntimeException
excepție cu mesajul Cannot index into a null array
.,
PS> $empty = $null SP> $empty Error: 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.count 4
PowerShell 3.0 a adăugat o proprietate count la majoritatea obiectelor. puteți avea un singur obiect și ar trebui să vă dea un număr de 1
.,
PS> $date = Get-Date PS> $date.count 1
Și $null
are un număr de proprietate, cu excepția de a se întoarce 0
.
PS> $null.count 0
Există unele capcane aici că voi revedea când am acoperi de verificare pentru $null
sau gol tablouri mai târziu în acest articol.
oprit de o eroare
o eroare de programare comună este creată deoarece matricele încep de la indexul 0. Un off de o eroare pot fi introduse în două moduri foarte frecvente.,
primul este de gândire mental pe care doriți elementul 2 și folosind un index de 2
și într-adevăr obținerea al treilea element. Sau gândindu-vă că aveți 4
articole și doriți ultimul articol, așa că veți folosi doar dimensiunea pentru a accesa ultimul articol.
$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 - 1
sau -1
despre care am aflat mai sus.,
PS> $data Three
aici puteți utiliza indexul -1
pentru a obține ultimul element.
PS> $data Three
Lee Dailey, de asemenea, mi-a arătat că putem folosi $data.GetUpperBound(0)
pentru a obține max numărul de index.
PS> $data.GetUpperBound(0) Three
al doilea mod cel mai frecvent este atunci când iterați lista și nu vă opriți la momentul potrivit. Voi revizui acest lucru atunci când vorbim despre utilizarea for
buclă.,
actualizarea elementelor
putem folosi același index pentru a actualiza elementele existente în matrice. Acest lucru ne oferă acces direct la actualizarea elementelor individuale.
$data = 'dos' $data = 'tres'
Dacă am încerca să actualizeze un element care este ultimul element, atunci vom obține un Index was outside the bounds of the array.
eroare.
voi revedea acest lucru mai târziu când voi vorbi despre cum să faceți o matrice mai mare.la un moment dat, va trebui 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 moduri de a procesa peste aceste valori. Când treceți o matrice la o conductă, fiecare element din interiorul matricei este procesat 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ă același lucru ca $_
. Puteți utiliza fie unul, deoarece ambele reprezintă obiectul curent în conducta.,
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 să apelați .ForEach()
pe o colecție.
PS> $data.foreach({"Item "}) Item Item Item Item
.foreach()
este nevoie de un parametru care este un bloc de script. Puteți renunța la paranteze și să furnizați doar 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ă în PowerShell 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 vedeți, este adesea în contextul mersului pe jos.
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 $index
să 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ăresc indicele 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 foarte ușor pentru a obține condiția ușor greșit pentru a obține un off de o eroare în logica ta., Folosind $index -le $data.count
sau $index -lt ($data.count - 1)
sunt vreodată atât de ușor greșit. Acest lucru ar determina rezultatul dvs. să proceseze prea multe sau prea puține elemente. Acesta este clasicul oprit de o singură eroare.
bucla de comutare
aceasta este una care este foarte ușor de trecut cu vederea. Dacă furnizați o matrice la o instrucțiune comutator, se va potrivi pe fiecare element din matrice.
$data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }
Acest lucru va produce această ieșire:
Tick Tock Tick Tock
Există o mulțime de lucruri interesante, ca aceasta pe care o putem face cu switch., Am un alt articol dedicat 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, veți dori pentru a actualiza valorile din matrice ca ai buclă peste ele. Majoritatea buclelor de mai sus folosesc o variabilă în buclă care deține o copie a valorii. Dacă actualizați acea variabilă, valoarea inițială din matrice nu este actualizată.
excepția de la această afirmație estefor
buclă., Dacă doriți să parcurgeți o matrice și să actualizați valorile în interiorul acesteia, atunci bucla for
este ceea ce căutați.
for ( $index = 0; $index -lt $data.count; $index++ ) { $data = "Item: " -f $data }
Această exemple are o valoare de index, face câteva modificări, și apoi folosește același index pentru a atribui î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 și obiecte.
$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 câteva detalii în valoare de subliniind.
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> $data FirstName LastName ----- ---- Kevin Marquette
putem accesa și actualiza proprietățile direct.,
PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName 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} Marquette Doe
cu ajutorul Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastName Marquette Doe
Dar PowerShell ne oferă posibilitatea de a solicita LastName
direct. PowerShell le va enumera pe toate pentru noi și ne va oferi o listă curată.,
PS> $data.LastName Marquette Doe
enumerarea încă se întâmplă, dar nu vedem complexitatea din spatele ei.
Where-Object filtering
acesta este locul unde Where-Object
vine astfel încât să putem filtra și selecta ceea ce dorim din matrice pe baza proprietăților obiectului.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette
putem scrie că aceeași interogare ca aceasta pentru a obține FirstName
suntem în căutarea pentru.,
$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ă pentru că trebuie să cunoaștem indexul 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ările proprietăților sale vor 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 variabilă la altceva care nu mai indică obiectul original din matrice., Acest lucru nu va funcționa 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.
-join
operatorul -join
este cel mai evident, așa că ne vom uita la el mai întâi. Îmi place operatorul -join
și îl folosesc des. Acesta va alătura toate elementele din matrice cu un caracter sau șir pe care îl specificați.,
PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $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 totul fără un delimitator, în loc de a face acest lucru:
PS> $data = @(1,2,3,4) PS> $data -join $null 1234
puteți folosi -join
cu matrice ca parametru fără prefix. Uitați-vă la acest exemplu pentru a vedea despre ce vorbesc.
PS> $data = @(1,2,3,4) PS> -join $data 1234
-înlocuiți și -split
alte operatorii, cum ar fi -replace
și -split
va executa pe fiecare element din matrice. Nu pot spune că le-am folosit vreodată în acest fel, dar iată un exemplu.,
PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03') PS> $data -replace 'ATX','LAX' LAX-SQL-01 LAX-SQL-02 LAX-SQL-03
-conține
-contains
operator vă va permite să verificați o serie de valori pentru a vedea dacă acesta conține o valoare 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, puteți folosi -in
operator. Valoarea ar fi pe partea stângă și matrice pe partea dreaptă a operațiunii.,
PS> $data = @('red','green','blue') PS> 'green' -in $data True
Acest lucru poate deveni scump dacă lista este mare. Voi folosi adesea un model regex dacă verific mai mult de 4-5 valori.
PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True
-eq și-ne
egalitatea și matricele se pot complica. Când matricea este pe partea stângă, fiecare element va fi comparat. În loc să returneze True
, acesta va returna obiectul care se potrivește.,
PS> $data = @('red','green','blue') PS> $data -eq 'green' green
atunci Când utilizați -ne
operator, vom lua toate valorile care nu sunt egale cu valoarea noastră.
PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue
atunci Când utilizați acest lucru într-un if()
declarație, valoarea returnată este un True
valoare. Dacă nu se returnează nicio valoare, atunci este o valoare False
. Ambele declarații următoare vor evalua 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 va încerca 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-01 ATX-SQL-01
atunci Când utilizați -match
cu o singură valoare, o variabilă special $Matches
va fi completat cu informatii meci. Acest lucru nu este cazul atunci 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 numit de multe moduri de a folosi regex.
$null sau empty
testarea pentru$null
sau matricele goale pot fi dificile. 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 mai multe articole 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ți numărul de obiecte din ea., Dacă matricea este $null
, numărul va fi 0
.
if ( $array.count -gt 0 ) { 'Array is not empty' }
există încă o capcană de care să aveți grijă aici. Puteți folosi count
chiar dacă aveți un singur obiect, 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ă sunteți încă pe PowerShell 5.,1, puteți înfășura obiectul într-o matrice înainte de a verifica numărul pentru a obține un număr precis.
if ( @($array).count -gt 0 ) { 'Array is not empty' }
pe deplin Să-l joace în condiții de siguranță, verificați pentru $null
, apoi verifica numărul.
if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not 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ă dacă există valori incorecte și apoi răstoarnă rezultatul.,
$results = Test-Something if ( -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ă o creșteți sau să adăugați un singur element, atunci trebuie să creați o nouă matrice și să copiați toate valorile din vechea matrice. Acest lucru sună scump și ca o mulțime de muncă, cu toate acestea, PowerShell ascunde complexitatea creării noului tablou.
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 + $second Zero One Two Three
Plus este egal cu +=
putem crea o nouă matrice în loc și se adaugă un element pentru a-l astfel:
$data = @( 'Zero' 'One' 'Two' 'Three' ) $data += 'four'
Doar amintiți-vă că de fiecare dată când utilizați +=
că sunteți web duplicarea și crearea unei noi matrice. Aceasta nu este o problemă pentru seturi de date mici, dar scalează extrem de slab.,
alocarea conductelor
puteți atribui rezultatele oricărei conducte într-o variabilă. Va fi o matrice dacă conține mai multe elemente.
$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. Putem folosi conducta cuforeach()
declarații și alte bucle. Deci, în loc să adăugăm elemente într-o matrice într-o buclă, putem arunca elemente pe conductă.,
$array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }
atribuind rezultateleforeach
unei variabile, capturăm toate obiectele și creăm o singură matrice.
tipuri de matrice
în mod implicit, o matrice î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 articole într-o matrice este una dintre cele mai mari limitări ale sale, dar există și alte câteva colecții la care 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 rapid. Acționează ca o matrice de obiecte în fiecare loc de care avem nevoie, dar se ocupă de adăugarea rapidă a articolelor.
Iată cum creăm un ArrayList
și adăugăm elemente la acesta.,
$myarray = ::new() $myArray.Add('Value')
solicităm în .Net pentru a obține acest tip. În acest caz, folosim constructorul implicit pentru a-l crea. 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. Unele apeluri. net vor face 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 utilizarea StringBuilder., Este aproape același lucru, dar are unele metode care sunt doar pentru a face față șirurilor.
StringBuilder
este special conceput pentru performanță.
- corzi Concatenate folosind StringBuilder
este foarte comun pentru a vedea oamenii muta la ArrayList
din matrice. Dar vine dintr-un moment în care C# nu avea suport generic., ArrayList
este depreciat în suport pentru generic List
Lista Generică
Un tip generic este un tip special în C# care definesc un generalizate clasa, iar utilizatorul va specifica tipurile de date se va folosi atunci când l-a creat. Deci, dacă doriți o listă de numere sau siruri de caractere, te-ar defini pe care doriți 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 un pic cu using namespace
declarație în PowerShell 5 și mai noi. Declarația using
trebuie să fie prima linie a scriptului. Prin declararea unui spațiu de nume, PowerShell vă va permite să î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 List
mult mai ușor de utilizat.
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> $myList 10
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") Zero One Three
când lucrați cu tipuri de valori, acesta va elimina 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 obiectul pe care doriți eliminat.
]$drives = Get-PSDrive $drives.remove($drives)
$delete = $drives $drives.remove($delete)
elimina metoda va returna 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 aspect pe care Mark Kraus l-a 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 este creată. Putem crea o matrice cu o dimensiune predeterminată apelând-o cu constructorul new($size)
.,
$data = ]::new(4) $data.count 4
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 * 3 red green blue red green blue red green blue
Inițializa cu 0
Un scenariu comun este că doriți să creați o matrice cu toate zerouri. Dacă aveți doar de gând să aibă numere întregi, o matrice puternic tastat de numere întregi va implicit la toate zerouri.
PS> ]::new(4) 0 0 0 0
putem folosi trucul de multiplicare pentru a face acest lucru.,
PS> $data = @(0) * 4 PS> $data 0 0 0 0
lucrul frumos despre trucul de multiplicare este că puteți utiliza orice valoare. Deci, dacă preferați să aveți 255
ca valoare implicită, aceasta ar fi o modalitate bună de a face acest lucru.
PS> $data = @(255) * 4 PS> $data 255 255 255 255
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-o grilă ca model.
iată două moduri în care putem crea o matrice 2 dimensională.,
$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 o matrice normală pe mai multe linii în cazul în care virgula a fost 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 = 0 PS> $inside = 2 PS> $data 3
adăugați un set de suport pentru fiecare nivel de matrice cuiburi., Primul set de paranteze este pentru cea mai mare matrice exterioară și apoi lucrați de acolo.
Write-Output-NoEnumerate
PowerShell îi place să despacheteze sau enumera matrice. Acesta este un aspect de bază al modului în care PowerShell folosește conducta, dar există momente în care nu doriți să se întâmple asta.
i de obicei obiecte de țeavă la Get-Member
pentru a afla mai multe despre ele. Când am țeavă o matrice să-l, acesta devine unwrapped și Get-membru vede membrii matrice și nu matrice reală.,
PS> $data = @('red','green','blue') PS> $data | Get-Member TypeName: System.String ...
Pentru a preveni ca desface de matrice, puteți folosi Write-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...
am un al doilea mod de a face acest lucru, care este mai mult de un hack (și încerc să evite hacks ca aceasta). Puteți plasa o virgulă în fața matricei înainte de a o pipa.
PS> ,$data | Get-Member TypeName: System.Object ...
Returneze un array
Acest onu-ambalaj de tablouri, de asemenea, se întâmplă atunci când ieșire sau valoarea returnată de o funcție., Puteți obține în continuare un tablou dacă atribuiți ieșirea unei variabile, astfel încât aceasta nu este de obicei o problemă.captura este că veți avea o nouă matrice. Dacă aceasta este vreodată o problemă, puteți utiliza Write-Output -NoEnumerate $array
sau return ,$array
pentru a rezolva problema.
altceva?
știu că toate acestea sunt multe de luat. Speranța mea este că veți învăța ceva din acest articol de fiecare dată când îl citiți și că se va dovedi a fi o referință bună pentru dvs. pentru mult timp., Dacă ați găsit acest lucru pentru a fi de ajutor, vă rugăm să-l împărtășească cu alții care credeți că va primi valoare din ea.
de aici, v-aș recomanda să consultați o postare similară pe care am scris-o despre hashtables.