Spesso quando scrivi script PowerShell, hai bisogno di un modo per memorizzare un set di elementi. Un modo comune per ottenere ciò è con un array o un tipo specifico noto come ArrayList. Ma cos’è comunque un array? Un array è una struttura dati progettata per memorizzare una raccolta di elementi. Questo può includere sia gli stessi che diversi tipi di elementi.

Gli array sono utilizzati in molti linguaggi di programmazione diversi e PowerShell non è diverso. Esistono molti modi per creare, manipolare e ottimizzare gli array., In questo articolo potrete conoscere ArrayLists, Array e collezioni, nonché alcune best practice quando li si applica con PowerShell.

Sommario

Prerequisiti/Requisiti

Poiché lavorerai solo con il linguaggio PowerShell stesso, non ci sono prerequisiti ambientali. Hai solo bisogno di avere un PC Windows con PowerShell. Più specificamente:

  • Windows PowerShell 3 o successivo
  • . NET Framework 4.5 o successivo

Vuoi ulteriori suggerimenti come questo?, Scopri il mio blog personale PowerShell a: https://nkasco.com/FriendsOfATA

Creazione di array con PowerShell

Ci sono molti modi diversi per creare array con PowerShell. Supponiamo che tu abbia un elenco di nomi che devi elaborare in qualche modo come mostrato di seguito.

JohnSusieJimJohnnyCarrie

Costruire array tramite elementi separati da virgole

Il modo più semplice per creare un array è semplicemente assegnare input noti, separati da virgole, a una variabile come mostrato di seguito.,

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

Se si esegue il metodoGetType()disponibile su tutti gli oggetti in PowerShell, si vedrà che è stato creato correttamente un array come indicato dalla proprietàBaseType mostrata di seguito.

PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array

Utilizzando l’operatore di sottoespressione

È anche possibile creare array in PowerShell tramite un operatore di sottoespressione. Questo concetto è comunemente usato quando non sai quanti elementi verranno aggiunti al tuo array. Il risultato può contenere zero o molti elementi quando creati.,

Nota sotto un array chiamato$MyArray è stato creato con zero elementi all’interno.

#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0

Utilizzando l’operatore di intervallo

Gli array non sono solo relegati alla memorizzazione di stringhe come mostrato sopra. È inoltre possibile creare array con altri tipi di oggetti come numeri interi.

Se hai bisogno di un array di numeri interi in ordine sequenziale, puoi prendere una scorciatoia e usare l’operatore... Di seguito puoi vedere che è stato creato un array con gli interi da 2 a 5 con una singola riga di codice.,

PS51> $NumberedArray = 2..5PS51> $NumberedArray2345

Creare raccolte ArrayList di PowerShell

Usare un ArrayList di PowerShell è anche un modo in cui è possibile memorizzare un elenco di elementi con PowerShell. La classe ArrayList fa parte del Sistema.Spazio dei nomi delle raccolte all’interno di. NET.Creando un nuovo oggetto di questo tipo è possibile memorizzare gli oggetti all’interno di un ArrayList.

Sotto puoi vedere che devi creare esplicitamente un oggetto ArrayList usando il cmdletNew-Object o lanciando un array standard su un oggetto ArrayList.,

Si noti che in questo casoBaseType è un oggetto mentre gli esempi precedenti hanno tipi di base di array che mostrano ereditarietà dalla classe Object. In definitiva, PowerShell fornisce l’accesso al sistema di tipo. NET.

Aggiunta di elementi a un array

Quando si crea un array, è possibile definire tutti gli elementi al momento della creazione o aggiungerli ad hoc.

Per aggiungere elementi a una raccolta esistente, è possibile utilizzare l’operatore += o il metodo Add. Ma sappi che ci sono grandi differenze nel modo in cui operano.,

Quando si crea un array standard con @(), si utilizzerà l’operatore += ma per aggiungere elementi a un ArrayList, si utilizzerà il Add metodo. Questi metodi differiscono in quanto l’operatore+= distrugge effettivamente l’array esistente e ne crea uno nuovo con il nuovo elemento.

Per dimostrare, vedrai sotto puoi fare riferimento alla proprietàIsFixedSize per un array o ArrayList per sapere quale è immutabile e quale no.,

PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse

Poiché un array di base è una raccolta di dimensioni fisse, non è possibile modificarlo.

Il tentativo di utilizzare il metodoAdd() con un array di dimensioni fisse comporterà un errore dovuto alla dimensione fissa. Qui di seguito potete vedere alcuni esempi in cui è possibile aggiungere correttamente elementi a un array.

#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"

Rimozione di elementi da un array

Ora che avete una migliore comprensione di come aggiungere elementi a un array, cerchiamo di coprire alcuni modi è possibile rimuovere gli elementi da un array.,

Poiché un array di base è fisso, non è possibile rimuovere gli elementi da essi. Invece, devi creare un array completamente nuovo. Ad esempio, è possibile rimuovere un singolo elemento da un array creando un’istruzione condizionale che corrisponda solo agli elementi che si desidera includere. Un esempio è mostrato di seguito.

$NewBasicArray = $BasicArray -ne "Nate"

Poiché un ArrayList non è fisso, è possibile rimuovere gli elementi da essi utilizzando il Remove() metodo. Questo è uno scenario in cui l’utilizzo di un ArrayList può avvantaggiarti se prevedi di aggiungere/rimuovere frequentemente elementi.,

$MyArrayList.Remove("Nate")

Recupero di elementi specifici da un array o ArrayList

Per recuperare elementi specifici da un array o ArrayList è possibile utilizzare molti metodi diversi. Proprio come altri oggetti in PowerShell, è possibile accedere a tutti gli elementi di un array semplicemente chiamando l’oggetto.

PS51> $BasicArrayJohnSusieJimJohnnyCarrie

Forse è necessario recuperare solo il primo elemento, gli array avranno sempre un’origine di 0 che rappresenta il primo elemento dell’array. Per recuperare il primo elemento di un array, specificare il numero di indice tra parentesi come mostrato di seguito.,

PS51> $BasicArrayJohn

Al contrario, puoi anche fare riferimento agli indici all’indietro usando un trattino (indicatore negativo) per chiamare l’ultimo numero X di elementi dall’array. Un modo comune per trovare l’ultimo elemento in un array sta usando -1 come mostrato di seguito.

PS51> $BasicArrayCarrie

L’operatore intervallo di cui si è appreso sopra può anche essere utilizzato per recuperare oggetti di un array seguendo lo stesso metodo di chiamata degli elementi. Supponiamo che tu voglia recuperare i primi quattro nomi nell’array$BasicArray.,

Puoi vedere sotto puoi specificare un intervallo di indici 0-3 che restituirà i primi quattro elementi.

PS51> $BasicArrayJohnSusieJimJohnny

Ottimizzazione degli array con PowerShell

Ora che hai una buona base su come creare e manipolare gli array, quale dovresti usare? Per rispondere a ciò, esaminiamo alcuni esempi con il cmdletMeasure-Command. Usando il cmdletMeasure-Command, capirai meglio quanto tempo impiegano i comandi per elaborare gli elementi mentre vengono trasmessi lungo la pipeline.,

In generale, se hai una piccola collezione di oggetti probabilmente non noterai molta differenza con il modo in cui manipoli i tuoi array. Tuttavia, se si dispone di una vasta collezione di oggetti, è importante comprendere le differenze per ottenere risultati ottimali.

Applichiamo ciò che hai appena appreso nella sezione precedente sulla differenza tra+= e usando il metodoAdd() con un ciclo di 50.000 articoli.

Innanzitutto, crea un array vuoto e un ArrayList vuoto come mostrato di seguito.,

PS51> $MyArray = @()PS51> $MyArrayList = @()

Successivamente, compilare 50.000 elementi in ogni raccolta utilizzando l’operatore range e un ciclo foreach come mostrato di seguito.

@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})

Infine, avvolgi i tuoi comandi in un’espressione e passa quell’espressione al cmdlet Measure-Command. Eseguendo l’espressione con Measure-Command, puoi vedere quanto tempo impiega effettivamente ogni processo per essere eseguito.

Tieni presente che, come hai imparato prima, += crea effettivamente un nuovo array piuttosto che aggiungerlo a uno fisso.,

Il risultato? Quasi 60 secondi contro 139 millisecondi!

Come puoi vedere, è molto più veloce sfruttare un ArrayList per raccolte di grandi dimensioni piuttosto che utilizzare un array di dimensioni fisse.

Mentre questo è un esempio di base, sottolinea l’importanza di capire cosa sta facendo il tuo codice durante l’elaborazione. Se non correttamente compreso, può comportare una scarsa esperienza utente.,

Se si dispone di uno script esistente che potrebbe trarre vantaggio dall’utilizzo di un ArrayList piuttosto che di un array, ciò rappresenterebbe una fantastica opportunità per apportare un miglioramento durante la notte!

Ulteriori letture

  • Confronto degli array con PowerShell
  • Come creare array per le prestazioni in PowerShell (MCPmag)

Vuoi ulteriori suggerimenti come questo? Scopri il mio blog personale PowerShell a: https://nkasco.com/FriendsOfATA.