- 10/08/2020
- 24 minuti per leggere
-
- j
- h
- V
Array sono una fondamentale caratteristica del linguaggio della maggior parte dei linguaggi di programmazione. Sono una raccolta di valori o oggetti difficili da evitare. Diamo un’occhiata da vicino agli array e a tutto ciò che hanno da offrire.,
Nota
La versione originale di questo articolo è apparso sul blog scritto da @KevinMarquette. Il team di PowerShell ringrazia Kevin per aver condiviso questo contenuto con noi. Si prega di controllare il suo blog atPowerShellExplained.com.
Che cos’è un array?
Inizierò con una descrizione tecnica di base di quali sono gli array e come vengono utilizzati dalla maggior parte dei linguaggi di programmazione prima di passare agli altri modi in cui PowerShell ne fa uso.
Un array è una struttura dati che funge da raccolta di più elementi., È possibile iterare su thearray o accedere a singoli elementi utilizzando un indice. L’array viene creato come un blocco sequenziale ofmemory in cui ogni valore è memorizzato proprio accanto all’altro.
Toccherò ognuno di questi dettagli mentre andiamo.
Utilizzo di base
Poiché gli array sono una caratteristica di base di PowerShell, esiste una sintassi semplice per lavorare con loro in PowerShell.,
Crea un array
Un array vuoto può essere creato usando@()
PS> $data = @()PS> $data.count0
Possiamo creare un array e seminare con i valori semplicemente mettendoli nel@()
parentesi.
PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree
Questo array ha 4 elementi. Quando chiamiamo la variabile$data
, vediamo l’elenco dei nostri articoli. Se è un anarray di stringhe, otteniamo una riga per stringa.
Possiamo dichiarare un array su più righe. La virgola è facoltativa in questo caso e generalmente lasciata fuori.,
$data = @( 'Zero' 'One' 'Two' 'Three')
Preferisco dichiarare i miei array su più righe in questo modo. Non solo diventa più facile da leggere quando si dispone di più elementi, ma rende anche più facile da confrontare con le versioni precedenti quando si utilizza sourcecontrol.
Altra sintassi
È comunemente inteso che@()
è la sintassi per la creazione di un array, ma le liste separate da virgole funzionano la maggior parte del tempo.,
$data = 'Zero','One','Two','Three'
Write-Output per creare array
Un piccolo trucco interessante degno di nota è che è possibile utilizzare Write-Output
per creare rapidamente stringhe nella console.
$data = Write-Output Zero One Two Three
Questo è utile perché non è necessario inserire virgolette attorno alle stringhe quando il parametro accettastringhe. Non lo farei mai in uno script, ma è un gioco equo nella console.
Accesso agli elementi
Ora che hai un array con elementi in esso, potresti voler accedere e aggiornare tali elementi.,
Offset
Per accedere ai singoli elementi, usiamo le parentesi con un valore di offset a partire da 0. Questo ècome otteniamo il primo elemento nel nostro array:
PS> $data = 'Zero','One','Two','Three'PS> $dataZero
Il motivo per cui usiamo zero qui è perché il primo elemento è all’inizio della lista, quindi usiamoun offset di 0 elementi per arrivarci. Per arrivare al secondo elemento, avremmo bisogno di usare un offset di 1 toskip il primo elemento.
PS> $dataOne
Ciò significherebbe che l’ultimo elemento è all’offset 3.,
PS> $dataThree
Index
Ora puoi vedere perché ho scelto i valori che ho fatto per questo esempio. Ho introdotto questo come offsetperché è quello che è veramente, ma questo offset è più comunemente indicato come indice. Anindex che inizia da 0
. Per il resto di questo articolo chiamerò l’offset un indice.
Trucchi indice speciale
Nella maggior parte delle lingue, è possibile specificare solo un singolo numero come indice e si ottiene un singolo elemento indietro.PowerShell è molto più flessibile. È possibile utilizzare più indici contemporaneamente., Fornendo un elenco diindici, possiamo selezionare diversi elementi.
PS> $dataZeroTwoThree
Gli articoli vengono restituiti in base all’ordine degli indici forniti. Se duplichi un indice, ottieni quell’elemento entrambe le volte.
PS> $dataThreeZeroThree
Possiamo specificare una sequenza di numeri con l’operatore..
incorporato.
PS> $dataOneTwoThree
Funziona anche al contrario.
PS> $dataThreeTwoOne
È possibile utilizzare valori di indice negativi per compensare dalla fine. Quindi, se hai bisogno dell’ultimo elemento nell’elenco,puoi usare -1
.,
PS> $dataThree
Fuori dai limiti
Nella maggior parte delle lingue, se si tenta di accedere a un indice di un elemento che è oltre la fine dell’array, si otterrebbe un qualche tipo di errore o un’eccezione. PowerShell restituisce silenziosamente nulla.
PS> $null -eq $dataTrue
Non è possibile indicizzare in un array null
Se la variabile è $null
e si tenta di indicizzarla come un array, si ottiene un’eccezioneSystem.Management.Automation.RuntimeException
con il messaggioCannot index into a null array
.,
PS> $empty = $nullSP> $emptyError: Cannot index into a null array.
Quindi assicurati che i tuoi array non siano $null
prima di provare ad accedere agli elementi al loro interno.
Count
Gli array e le altre raccolte hanno una proprietà count che indica quanti elementi sono nell’array.
PS> $data.count4
PowerShell 3.0 ha aggiunto una proprietà count alla maggior parte degli oggetti. puoi avere un singolo oggetto e dovrebbe darti un conteggio di1
.
PS> $date = Get-DatePS> $date.count1
Anche $null
ha una proprietà count tranne che restituisce 0
.,
PS> $null.count0
Ci sono alcune trappole qui che rivedrò quando coprirò il controllo di $null
o array vuoti in questo articolo.
Errori off-by-one
Viene creato un errore di programmazione comune perché gli array iniziano dall’indice 0. Gli errori off-by-one possono essere introdotti in due modi.
Il primo è pensare mentalmente che si desidera il secondo elemento e utilizzare un indice di2
e ottenere davvero il terzo elemento. O pensando di avere quattro elementi e si desidera ultimo elemento, in modo da utilizzare il countto accedere all’ultimo elemento.,
$data
PowerShell è perfettamente felice di permetterti di farlo e di darti esattamente quale elemento esiste all’indice 4: $null
. Dovresti usare $data.count - 1
o-1
che abbiamo appreso sopra.
PS> $dataThree
Qui è possibile utilizzare l’indice-1
per ottenere l’ultimo elemento.
PS> $dataThree
Lee Dailey mi ha anche fatto notare che possiamo usare $data.GetUpperBound(0)
per ottenere il numero massimo di indexnumber.,
PS> $data.GetUpperBound(0)3PS> $dataThree
Il secondo modo più comune è quando si itera l’elenco e non si ferma al momento giusto. Lo rivisiterò quando parliamo di utilizzare il ciclofor
.
Aggiornamento degli elementi
Possiamo usare lo stesso indice per aggiornare gli elementi esistenti nell’array. Questo ci dà accesso diretto toupdate singoli elementi.
$data = 'dos'$data = 'tres'
Se proviamo ad aggiornare un elemento che supera l’ultimo elemento, otteniamo un erroreIndex was outside the bounds of the array.
.
Lo rivisiterò più tardi quando parlerò di come ingrandire un array.,
Iterazione
Ad un certo punto, potrebbe essere necessario camminare o iterare l’intero elenco ed eseguire alcune azioni per eachitem nell’array.
Pipeline
Gli array e la pipeline PowerShell sono pensati l’uno per l’altro. Questo è uno dei modi più semplici perprocesso su quei valori. Quando si passa un array a una pipeline, ogni elemento all’interno dell’array viene elaborato individualmente.
PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item:
Se non hai visto prima$PSItem
, sappi che è la stessa cosa di$_
., È possibile utilizzare eitherone perché entrambi rappresentano l’oggetto corrente nella pipeline.
Ciclo ForEach
Il cicloForEach
funziona bene con le raccolte. Usando la sintassi: foreach ( <variable> in <collection> )
foreach ( $node in $data ){ "Item: "}
ForEach method
Tendo a dimenticarmi di questo ma funziona bene per operazioni semplici. PowerShell consente di chiamare .ForEach()
su una raccolta.
PS> $data.foreach({"Item "})Item Item Item Item
Il.foreach()
accetta un parametro che è un blocco di script., Puoi eliminare le parentesi e semplicementefornire il blocco di script.
$data.foreach{"Item "}
Questa è una sintassi meno conosciuta ma funziona allo stesso modo. Questo metodo foreach
è stato aggiunto inPowerShell 4.0.
Per loop
Il for
loop è usato pesantemente nella maggior parte delle altre lingue, ma non lo vedi molto in PowerShell. Quando lo vedi, è spesso nel contesto di camminare su un array.
for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}
La prima cosa che facciamo è inizializzare un$index
a0
., Quindi aggiungiamo la condizione che$index
deve essere inferiore a$data.count
. Infine, specifichiamo che ogni volta che eseguiamo il loop che devo aumentare l’indice di 1
. In questo caso $index++
è l’abbreviazione di$index = $index + 1
.
Ogni volta che si utilizza un ciclofor
, prestare particolare attenzione alla condizione. Ho usato $index -lt $data.count
qui. È facile ottenere la condizione leggermente sbagliata per ottenere un errore off-by-one nella tua logica., L’utilizzo di $index -le $data.count
o $index -lt ($data.count - 1)
è sempre leggermente sbagliato. Ciò causerebbe il risultato per elaborare troppi o troppo pochi elementi. Questo è il classico errore off-by-one.
Interruttore loop
Questo è uno che è facile da trascurare. Se si fornisce un array a un’istruzione switch, controlla ogni elemento nell’array.
$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock
Ci sono molte cose interessanti che possiamo fare con l’istruzione switch. Ho un altro articolo dedicato a questo.,
- Tutto quello che avresti sempre voluto sapere sull’istruzione switch
Aggiornamento dei valori
Quando il tuo array è una raccolta di stringhe o numeri interi (tipi di valore), a volte potresti voler aggiungere i valori nell’array durante il ciclo su di essi. La maggior parte dei loop sopra utilizza una variabile in theloop che contiene una copia del valore. Se si aggiorna tale variabile, il valore originale nell’array non viene aggiornato.
L’eccezione a tale istruzione è il ciclofor
., Se vuoi camminare su un array e aggiornare valuesinside it, allora il ciclo for
è quello che stai cercando.
for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}
Questo esempio prende un valore per indice, apporta alcune modifiche e quindi utilizza lo stesso indice per assegnarlo.
Array di oggetti
Finora, l’unica cosa che abbiamo inserito in un array è un tipo di valore, ma gli array possono anche contenereoggetti.
$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})
Molti cmdlet restituiscono raccolte di oggetti come array quando li si assegna a una variabile.,
$processList = Get-Process
Tutte le funzionalità di base di cui abbiamo già parlato si applicano ancora agli array di oggetti con alcuni dettagli che vale la pena sottolineare.
Accesso alle proprietà
Possiamo usare un indice per accedere a un singolo elemento in una raccolta proprio come con i tipi di valore.
PS> $dataFirstName LastName----- ----Kevin Marquette
Possiamo accedere e aggiornare direttamente le proprietà.,
PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette
Proprietà array
Normalmente si dovrebbe enumerare l’intero elenco in questo modo per accedere a tutte le proprietà:
PS> $data | ForEach-Object {$_.LastName}MarquetteDoe
O utilizzando il Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe
Ma PowerShell ci offre la possibilità di richiedere LastName
direttamente. PowerShell enumera themall per noi e restituisce un elenco pulito.
PS> $data.LastNameMarquetteDoe
L’enumerazione avviene ancora ma non vediamo la complessità dietro di essa.,
Where-Object filtering
Questo è doveWhere-Object
entra in modo da poter filtrare e selezionare ciò che vogliamo dall’arraybased sulle proprietà dell’oggetto.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette
Possiamo scrivere la stessa query per ottenere ilFirstName
che stiamo cercando.
$data | Where FirstName -eq Kevin
Dove ()
Gli array hanno un Where()
metodo su di essi che consente di specificare un scriptblock
per il filtro.
$data.Where({$_.FirstName -eq 'Kevin'})
Questa funzione è stata aggiunta in PowerShell 4.0.,
Aggiornamento degli oggetti nei loop
Con i tipi di valore, l’unico modo per aggiornare l’array è utilizzare un ciclo for perché è necessario conoscere l’indice per sostituire il valore. Abbiamo più opzioni con gli oggetti perché sono tipi di riferimento. Ecco un rapido esempio:
foreach($person in $data){ $person.FirstName = 'Kevin'}
Questo ciclo sta camminando su ogni oggetto nell’array $data
. Poiché gli oggetti sono tipi di riferimento, la variabile$person
fa riferimento allo stesso oggetto presente nell’array. Quindi gli aggiornamenti alle sue proprietà aggiornano l’originale.,
Non è ancora possibile sostituire l’intero oggetto in questo modo. Se si tenta di assegnare un nuovo oggetto alla variabile$person
, si aggiorna il riferimento alla variabile a qualcos’altro che non punta più all’oggetto originale nell’array. Questo non funziona come ci si aspetterebbe:
foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}
Operatori
Gli operatori in PowerShell funzionano anche su array. Alcuni di loro funzionano in modo leggermente diverso.
-join
L’operatore-join
è il più ovvio, quindi diamo un’occhiata prima., Mi piace l’operatore-join
e lo uso spesso. Unisce tutti gli elementi dell’array con il carattere o la stringa chespecifica.
PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4
Una delle caratteristiche che mi piacciono dell’operatore -join
è che gestisce singoli elementi.
PS> 1 -join '-'1
Lo uso all’interno della registrazione e dei messaggi dettagliati.
PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.
-join array array
Ecco un trucco intelligente che Lee Dailey mi ha fatto notare., Se vuoi unirti a tuttosenza un delimitatore, invece di fare questo:
PS> $data = @(1,2,3,4)PS> $data -join $null1234
Puoi usare -join
con l’array come parametro senza prefisso. Date un’occhiata a questo esempio tosee che sto parlando.
PS> $data = @(1,2,3,4)PS> -join $data1234
-replace and-split
Gli altri operatori come-replace
e-split
eseguono su ogni elemento dell’array. Non posso dire che li abbia mai usati in questo modo, ma ecco un esempio.,
PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03
-contiene
L’operatore-contains
consente di controllare un array di valori per vedere se contiene un valore specificato.
PS> $data = @('red','green','blue')PS> $data -contains 'green'True
-in
Quando si dispone di un singolo valore che si desidera verificare corrisponde a uno dei diversi valori, è possibile utilizzare l’operatore-in
. Il valore sarebbe a sinistra e l’array sul lato destro dell’operatore.
PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue
Questo può diventare costoso se l’elenco è grande. Uso spesso un modello regex se sto controllando più di pochi valori.,
PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue
-eq e-ne
L’uguaglianza e gli array possono complicarsi. Quando l’array si trova sul lato sinistro, ogni elemento ottieneconfrontato. Invece di restituire True
, restituisce l’oggetto che corrisponde.
PS> $data = @('red','green','blue')PS> $data -eq 'green'green
Quando si utilizza l’operatore-ne
, otteniamo tutti i valori che non sono uguali al nostro valore.
PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue
Quando lo si utilizza in un’istruzioneif()
, un valore che viene restituito è un valoreTrue
., Se non viene restituito alcun valore, è un valoreFalse
. Entrambe queste istruzioni successive valutano True
.
$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}
Lo rivisiterò in un momento in cui parliamo di test per $null
.
-match
L’operatore-match
tenta di abbinare ogni elemento della raccolta.
PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01
Quando si utilizza-match
con un singolo valore, una variabile speciale$Matches
viene popolata con matchinfo., Questo non è il caso quando un array viene elaborato in questo modo.
Possiamo adottare lo stesso approccio con Select-String
.
$servers | Select-String SQL
Do un’occhiata più da vicino aSelect-String
, -match
e la $matches
variabile in un altro post chiamaToi molti modi per usare regex.
null null o empty
Il test per$null
o array vuoti può essere complicato. Ecco le trappole comuni con gli array.
A colpo d’occhio, questa affermazione sembra che dovrebbe funzionare.,
if ( $array -eq $null){ 'Array is $null'}
Ma ho appena esaminato come-eq
controlla ogni elemento nell’array. Quindi possiamo avere una matrice di severalitems con un singolo valore null null e valuterebbe $true
$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}
Questo è il motivo per cui è consigliabile posizionare $null
sul lato sinistro dell’operatore. Questo makesthis scenario un non-problema.
if ( $null -eq $array ){ 'Array actually is $null'}
A $null
array non è la stessa cosa di un array vuoto. Se sai di avere un array, controlla ilconto di oggetti in esso contenuti., Se l’array è $null
, il conteggio è 0
.
if ( $array.count -gt 0 ){ "Array isn't empty"}
C’è un’altra trappola a cui prestare attenzione qui. È possibile utilizzare count
anche se si dispone di un singleobject, a meno che l’oggetto non sia unPSCustomObject
. Questo è un bug che è stato risolto in PowerShell 6.1.Questa è una buona notizia, ma un sacco di persone sono ancora su 5.1 e hanno bisogno di guardare fuori per esso.
PS> $object = @{Name='TestObject'}PS> $object.count$null
Se sei ancora su PowerShell 5.1, puoi avvolgere l’oggetto in un array prima di controllare il conteggio per ottenere un conteggio accurato.,
if ( @($array).count -gt 0 ){ "Array isn't empty"}
Per giocare completamente sul sicuro, controllare$null
, quindi controllare il conteggio.
if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}
All-eq
Recentemente ho visto qualcuno chiedere come verificare che ogni valore in un array corrisponda a un dato valore.Reddit user / u / bis ha avuto questa soluzione intelligente che controlla eventuali valori errati e thenflips il risultato.
$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}
Aggiunta agli array
A questo punto, stai iniziando a chiederti come aggiungere elementi a un array. La risposta rapida è che non puoi. Un array è una dimensione fissa in memoria., Se hai bisogno di coltivarlo o aggiungere un singolo elemento ad esso, alloraè necessario creare un nuovo array e copiare tutti i valori dal vecchio array. Questo suona come un sacco di lavoro, tuttavia, PowerShell nasconde la complessità della creazione del nuovo array. powershellimplica l’operatore di addizione (+
) per gli array.
Nota
PowerShell non implementa un’operazione di sottrazione. Se si desidera un’alternativa flessibile ad anarray, è necessario utilizzare un oggetto List
generico.,
Array addition
Possiamo usare l’operatore addition con array per creare un nuovo array. Quindi, dati questi due array:
$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')
Possiamo aggiungerli insieme per ottenere un nuovo array.
PS> $first + $secondZeroOneTwoThree
Più uguale a +=
Possiamo creare un nuovo array sul posto e aggiungere un elemento ad esso come questo:
$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'
Basta ricordare che ogni volta che si utilizza +=
che si sta duplicando e creando un nuovo matrice. Thisis un non un problema per piccoli set di dati, ma scala estremamente male.,
Assegnazione pipeline
È possibile assegnare i risultati di qualsiasi pipeline in una variabile. È un array se contiene multipleitems.
$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}
Normalmente quando pensiamo di usare la pipeline, pensiamo ai tipici one-liner di PowerShell. Possiamo utilizzare la pipeline conforeach()
istruzioni e altri loop. Quindi, invece di aggiungere elementi ad anarray in un ciclo, possiamo rilasciare elementi sulla pipeline.
$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}
Tipi di array
Per impostazione predefinita, un array in PowerShell viene creato come tipo ]
., Ciò consente di contenerequalsiasi tipo di oggetto o valore. Questo funziona perché tutto è ereditato dal tipoPSObject
.
Array fortemente tipizzati
È possibile creare un array di qualsiasi tipo utilizzando una sintassi simile. Quando si crea un array fortemente tipizzato, può contenere solo valori o oggetti del tipo specificato.
ArrayList
L’aggiunta di elementi a un array è uno dei suoi più grandi limiti, ma ci sono alcune altre collezioni a cui possiamo rivolgerci per risolvere questo problema.,
Il ArrayList
è comunemente una delle prime cose che pensiamo quando abbiamo bisogno di un array che isfaster con cui lavorare. Agisce come un array di oggetti in ogni posto in cui ne abbiamo bisogno, ma gestisce rapidamente addingitems.
Ecco come creiamo unArrayList
e aggiungiamo elementi ad esso.
$myarray = ::new()$myArray.Add('Value')
Stiamo chiamando in.NET per ottenere questo tipo. In questo caso, stiamo usando il costruttore predefinito percrearlo. Quindi chiamiamo il metodoAdd
per aggiungere un elemento ad esso.,
Il motivo per cui sto usando all’inizio della riga è quello di sopprimere il codice di ritorno. Some.NET le chiamate fanno questo e possono creare output imprevisto.
Se gli unici dati che hai nel tuo array sono stringhe, dai un’occhiata anche a usingStringBuilder. È quasi la stessa cosa, ma ha alcuni metodi che sono solo per trattare withstrings. Il StringBuilder
è appositamente progettato per le prestazioni.
È comune vedere le persone spostarsi su ArrayList
dagli array. Ma viene da un momento in cui C # did’thave supporto generico., Il ArrayList
è deprecato nel supporto per il genericoList
Elenco generico
Un tipo generico è un tipo speciale in c# che definisce una classe generalizzata e l’utente specifica i tipi di dati che utilizza quando viene creato. Quindi, se vuoi un elenco di numeri o stringhe, definiresti che vuoi un elenco di tipi int
o string
.
Ecco come si crea un elenco per le stringhe.
$mylist = ]::new()
O una lista per i numeri.,
$mylist = ]::new()
Possiamo lanciare un array esistente in una lista come questa senza creare prima l’oggetto:
$mylist = ]@(1,2,3)
Possiamo abbreviare la sintassi con l’istruzioneusing namespace
in PowerShell 5 e versioni successive. L’istruzioneusing
deve essere la prima riga dello script. Dichiarando uno spazio dei nomi, Powershelllet si lascia fuori dei tipi di dati quando li si fa riferimento.
using namespace System.Collections.Generic$myList = ]@(1,2,3)
Questo rende ilList
molto più utilizzabile.,
Hai a disposizione un metodo simile Add
. A differenza di ArrayList, non esiste alcun valore di ritorno sul metodo Add
quindi non dobbiamo void
.
$myList.Add(10)
E possiamo ancora accedere agli elementi come altri array.
PS> $myList10
List
Puoi avere un elenco di qualsiasi tipo, ma quando non conosci il tipo di oggetti, puoi usare ]
per contenerli.,
$list = ]::new()
Remove ()
Il ArrayList
e il generico List
supportano entrambi la rimozione di elementi dalla collezione.
using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree
Quando si lavora con i tipi di valore, rimuove il primo dall’elenco. Puoi chiamarlo di nuovo andover per continuare a rimuovere quel valore. Se si dispone di tipi di riferimento, è necessario fornire l’oggetto che si desidera rimuovere.,
]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)
Il metodo remove restituiscetrue
se è stato in grado di trovare e rimuovere l’elemento dalla raccolta.
Altre collezioni
Ci sono molte altre collezioni che possono essere utilizzate, ma queste sono le buone sostituzioni di array generici.Se siete interessati a conoscere più di queste opzioni, dare un’occhiata a thisGist thatMark Kraus messo insieme.
Altre sfumature
Ora che ho coperto tutte le principali funzionalità, ecco alcune altre cose che volevo ricordare prima di concludere questo.,
Array pre-dimensionati
Ho detto che non è possibile modificare le dimensioni di un array una volta creato. Possiamo creare una matrice di una dimensione predeterminata chiamandola con il costruttorenew($size)
.
$data = ]::new(4)$data.count4
Moltiplicare gli array
Un piccolo trucco interessante è che puoi moltiplicare un array per un numero intero.
PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue
Inizializza con 0
Uno scenario comune è che si desidera creare un array con tutti gli zeri. Se hai solo integeri, un array di numeri interi fortemente tipizzato è predefinito su tutti gli zeri.,
PS> ]::new(4)0000
Possiamo usare il trucco moltiplicatore anche per fare questo.
PS> $data = @(0) * 4PS> $data0000
La cosa bella del trucco moltiplicativo è che puoi usare qualsiasi valore. Quindi, se si preferisce avere 255
come valore predefinito, questo sarebbe un buon modo per farlo.
PS> $data = @(255) * 4PS> $data255255255255
Array nidificati
Un array all’interno di un array è chiamato array nidificato. Non li uso molto in PowerShell ma li ho usati di più in altre lingue. Considerare l’utilizzo di un array di array quando i dati si inseriscono in un modello a griglia.,
Ecco due modi in cui possiamo creare un array bidimensionale.
$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))
La virgola è molto importante in questi esempi. Ho dato un esempio precedente di un normale array su righe multiple in cui la virgola era facoltativa. Questo non è il caso di un array multidimensionale.
Il modo in cui usiamo la notazione dell’indice cambia leggermente ora che abbiamo un array nidificato. Usando$data
sopra, questo è il modo in cui accederemmo al valore 3.
PS> $outside = 0PS> $inside = 2PS> $data3
Aggiungi un set di parentesi per ogni livello di nidificazione dell’array., Il primo set di parentesi è per l’array più esterno e poi ti fai strada da lì.
Write-Output-NoEnumerate
PowerShell ama scartare o enumerare gli array. Questo è un aspetto fondamentale del modo in cui PowerShell utilizza thepipeline, ma ci sono volte in cui non vuoi che ciò accada.
Comunemente pipe oggetti aGet-Member
per saperne di più su di loro. Quando pipe un array ad esso, itgets unwrapped e Get-Member vede i membri dell’array e non l’array effettivo.,
PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...
Per evitare che lo scartamento della matrice, è possibile utilizzareWrite-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...
Ho un secondo modo che è più di un hack (e cerco di evitare hack come questo). È possibile posizionare acomma davanti all’array prima di condurlo.
PS> ,$data | Get-MemberTypeName: System.Object...
Restituisce un array
Questo scartamento degli array avviene anche quando si emettono o restituiscono valori da una funzione. Puoi ancora ottenere un array se assegni l’output a una variabile, quindi questo non è comunemente un problema.
Il problema è che hai un nuovo array., Se questo è mai un problema, puoi usareWrite-Output -NoEnumerate $array
oreturn ,$array
per aggirarlo.
Lascia un commento