HOWTO · PowerShell
Come creare un array, una tabella hash e un dizionario in PowerShell
Impara a creare e usare array, tabelle hash e dizionari ordinati in PowerShell con questa guida completa. Comprendi le differenze chiave, come accedere agli elementi, aggiungerli e rimuoverli, e quando usare ciascuna struttura di dati. Include esempi pratici, casi d'uso reali e una sezione di domande frequenti per aiutarti a padroneggiare in modo efficiente gli script di PowerShell e la manipolazione dei dati. Perfetto per principianti e utenti avanzati che vogliono migliorare l'automazione e l'organizzazione dei dati in PowerShell.
In questa pagina
Scegli un array (@()) per una sequenza di valori, una tabella hash (@{}) per la ricerca per chiave-valore e un dizionario ordinato ([ordered]@{}) quando deve essere conservato l’ordine in cui sono state aggiunte le chiavi. Gli esempi seguenti sono frammenti di PowerShell autonomi. Per questi esempi non sono disponibili osservazioni di runtime, quindi non viene affermato alcun output.
Creare array in PowerShell
Un array memorizza più valori in una variabile. Gli indici degli array di PowerShell iniziano da zero, e -1 si riferisce all’ultimo elemento. @() raccoglie esplicitamente i risultati come array, anche quando un comando restituisce un singolo valore. Esegui questo esempio:
$items = @('apple', 'banana', 'cherry')
$items[0]
$items[-1]
$items += 'date'
$items = @($items | Where-Object { $_ -ne 'banana' })
$items -join ', '
L’esempio legge il primo e l’ultimo valore, aggiunge un valore, quindi assegna un array filtrato che esclude banana. Gli array di PowerShell hanno una dimensione fissa; += crea un array risultante e lo riassegna, quindi aggiungere ripetutamente a un array di grandi dimensioni può richiedere copie ripetute. Per aggiunte e rimozioni frequenti, una raccolta mutabile come System.Collections.Generic.List[object] può essere più adatta. Per ispezionare il tipo di un array, usa $items.GetType().FullName; @() produce un Object[] per questi valori stringa.
Lavorare con le tabelle hash in PowerShell
Una tabella hash di PowerShell mappa le chiavi ai valori. Creane una con @{}, leggi una voce con la notazione con parentesi, assegna una chiave per aggiungere o sostituire una voce, e chiama .Remove() per eliminarne una. Le parentesi funzionano in modo affidabile per nomi di chiave arbitrari; la notazione con punto è comoda quando una chiave è un nome semplice simile a una proprietà, ma può entrare in conflitto con membri incorporati come Count.
$inventory = @{ Fruit = 'Apple'; Color = 'Red'; Count = 5 }
$inventory['Color']
$inventory['Shape'] = 'Round'
$inventory.Remove('Color')
$inventory.GetEnumerator() | Sort-Object Name | ForEach-Object {
"{0}={1}" -f $_.Name, $_.Value
}
L’ultima pipeline ordina le voci emesse per chiave per la visualizzazione. Non riordina né sostituisce la tabella hash originale. Le chiavi delle tabelle hash di PowerShell non distinguono tra maiuscole e minuscole per impostazione predefinita; usa una raccolta diversa quando la semantica di confronto delle chiavi deve essere diversa.
Creare dizionari ordinati in PowerShell
Il letterale [ordered] crea un dizionario ordinato e conserva l’ordine in cui le voci sono state inserite. Accedi alle voci e aggiornale con le chiavi proprio come in una tabella hash. L’ordine di inserimento è distinto dall’ordinamento alfabetico: l’ordine originale rimane la sequenza di inserimento, a meno che tu non ordini esplicitamente un risultato separato.
$settings = [ordered]@{ Name = 'Delft'; Region = 'South Holland'; Active = $true }
$settings['Region']
$settings['Timezone'] = 'Europe/Amsterdam'
$settings.GetEnumerator() | ForEach-Object {
"{0}={1}" -f $_.Key, $_.Value
}
Tabella hash e dizionario ordinato: differenze chiave
| Caratteristica | Tabella hash | Dizionario ordinato |
| Letterale PowerShell | @{} | [ordered]@{} |
| Modello di dati | Le chiavi mappano sui valori | Le chiavi mappano sui valori |
| Ordine di iterazione | Non fare affidamento sull’ordine di inserimento | Conserva l’ordine di inserimento |
| Leggere o aggiornare una voce | $table['key'] | $dictionary['key'] |
| Più adatto per | La ricerca per chiave quando l’ordine di visualizzazione non è importante | Dati chiave-valore il cui ordine di inserimento conta |
Una tabella hash di PowerShell non è la stessa cosa di qualsiasi tipo di dizionario .NET. System.Collections.Hashtable è un tipo .NET utilizzato dal letterale @{} di PowerShell, mentre .NET fornisce anche altre implementazioni di dizionari con un proprio comportamento di ordinamento e confronto. Scegli in base al tipo e al comportamento specifici di cui il tuo codice ha bisogno. Evita di supporre che una delle due raccolte sia più veloce senza misurare il carico di lavoro effettivo.
Casi d’uso pratici
Usa un dizionario ordinato per i campi utente o di configurazione quando l’output deve seguire una sequenza scelta. Usa una tabella hash per contare le parole per chiave. Questi esempi mostrano entrambe le attività; il codice è autonomo e non viene rivendicato alcun output per esso.
$user = [ordered]@{
Name = 'John Doe'
Email = 'johndoe@example.com'
Role = 'Admin'
}
$user.GetEnumerator() | ForEach-Object { "{0}: {1}" -f $_.Key, $_.Value }
$text = 'apple banana apple orange apple banana'
$wordCount = @{}
$text.Split() | ForEach-Object {
if ($wordCount.ContainsKey($_)) {
$wordCount[$_] += 1
} else {
$wordCount[$_] = 1
}
}
$wordCount.GetEnumerator() | Sort-Object Name | ForEach-Object {
"{0}: {1}" -f $_.Name, $_.Value
}
Conclusione
Usa gli array per sequenze ordinate che elabori per posizione, le tabelle hash per la ricerca basata sulle chiavi e i dizionari ordinati quando la sequenza di inserimento fa parte dei dati che presenti. Ricorda che += per gli array assegna un nuovo array, che il filtraggio restituisce un risultato da assegnare e che l’ordinamento delle voci enumerate di una tabella hash cambia il risultato visualizzato piuttosto che la tabella stessa.
Domande frequenti (FAQ)
Qual è la differenza tra una tabella hash e un dizionario in PowerShell?
Nell’uso quotidiano di PowerShell, «dizionario» può descrivere una struttura generale chiave-valore, e @{} crea una tabella hash di PowerShell basata sul tipo .NET System.Collections.Hashtable. Anche la libreria di classi .NET ha tipi di dizionario distinti, quindi verifica il tipo concreto quando le API richiedono un’implementazione particolare.
Come aggiungo o rimuovo elementi da un array di PowerShell?
Aggiungi con $array += 'newItem', quindi assegna il risultato di nuovo alla variabile. Per rimuovere i valori corrispondenti, filtra e assegna il risultato, ad esempio $array = @($array | Where-Object { $_ -ne 'itemToRemove' }). Queste operazioni producono un array come risultato; non ridimensionano l’array esistente sul posto.
Posso ordinare una tabella hash in PowerShell?
Ordina le sue voci per la visualizzazione con $hash.GetEnumerator() | Sort-Object Name. Questo restituisce le voci ordinate e lascia $hash invariata. Usa [ordered]@{} quando hai bisogno dell’ordine di inserimento; conserva l’ordine in cui le voci sono state aggiunte, invece di ordinare le chiavi alfabeticamente.