about_Hash_Tables
Descrizione breve
Descrive come creare, usare e ordinare tabelle hash in PowerShell.
Descrizione lunga
Una tabella hash, nota anche come dizionario o matrice associativa, è una struttura di dati compatta che archivia una o più coppie chiave-valore. Ad esempio, una tabella hash può contenere una serie di indirizzi IP e nomi di computer, in cui gli indirizzi IP sono le chiavi e i nomi dei computer sono i valori o viceversa.
In PowerShell ogni tabella hash è un Hashtable[System.Collections.Hashtable]
oggetto . È possibile usare le proprietà e i metodi degli Hashtable oggetti in PowerShell.
A partire da PowerShell 3.0, è possibile usare l'attributo [ordered]
per creare un [System.Collections.Specialized.OrderedDictionary]
oggetto in PowerShell.
I dizionari ordinati differiscono dalle tabelle hash in quanto le chiavi vengono sempre visualizzate nell'ordine in cui vengono elencate. L'ordine delle chiavi in una tabella hash non è determinato.
Le chiavi e il valore nelle tabelle hash sono anche oggetti .NET. Sono più spesso stringhe o numeri interi, ma possono avere qualsiasi tipo di oggetto. È anche possibile creare tabelle hash annidate, in cui il valore di una chiave è un'altra tabella hash.
Hashtables vengono spesso usati perché sono efficienti per la ricerca e il recupero dei dati. È possibile usare tabelle hash per archiviare elenchi e per creare proprietà calcolate in PowerShell. PowerShell include inoltre un cmdlet , ConvertFrom-StringData
, che converte le stringhe in una tabella hash.
Sintassi
La sintassi di una tabella hash è la seguente:
@{ <name> = <value>; [<name> = <value> ] ...}
La sintassi di un dizionario ordinato è la seguente:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
L'acceleratore [ordered]
di tipi è stato introdotto in PowerShell 3.0.
Creazione di tabelle hash
Per creare una tabella hash, seguire queste linee guida:
- Iniziare la tabella hash con un segno
@
(). - Racchiudere la tabella hash tra parentesi graffe (
{}
). - Immettere una o più coppie chiave-valore per il contenuto della tabella hash.
- Usare un segno di uguale (
=
) per separare ogni chiave dal relativo valore. - Usare un punto e virgola (
;
) o un'interruzione di riga per separare le coppie chiave-valore. - Le chiavi contenenti spazi devono essere racchiuse tra virgolette. I valori devono essere espressioni di PowerShell valide. Le stringhe devono essere visualizzate tra virgolette, anche se non includono spazi.
- Per gestire la tabella hash, salvarla in una variabile.
- Quando si assegna una tabella hash ordinata a una variabile, posizionare il
[ordered]
tipo prima del@
simbolo. Se la si posiziona prima del nome della variabile, il comando ha esito negativo.
Per creare una tabella hash vuota nel valore di $hash, digitare:
$hash = @{}
È anche possibile aggiungere chiavi e valori a una tabella hash durante la creazione. Ad esempio, l'istruzione seguente crea una tabella hash con tre chiavi.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Creazione di dizionari ordinati
È possibile creare un dizionario ordinato aggiungendo un oggetto del OrderedDictionary tipo, ma il modo più semplice per creare un dizionario ordinato consiste nell'usare l'attributo [ordered]
.
L'attributo [ordered]
viene introdotto in PowerShell 3.0.
Posizionare l'attributo immediatamente prima del simbolo "@".
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
È possibile usare dizionari ordinati nello stesso modo in cui si usano tabelle hash. Entrambi i tipi possono essere usati come valore di parametri che accettano una tabella hash o un dizionario (iDictionary).
Non è possibile usare l'attributo per convertire o eseguire il [ordered]
cast di una tabella hash. Se si inserisce l'attributo ordinato prima del nome della variabile, il comando non riesce con il messaggio di errore seguente.
[ordered]$hash = @{}
ParserError:
Line |
1 | [ordered]$hash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Per correggere l'espressione, spostare l'attributo [ordered].
$hash = [ordered]@{}
È possibile eseguire il cast di un dizionario ordinato in una tabella hash, ma non è possibile recuperare l'attributo ordinato, anche se si cancella la variabile e si immettono nuovi valori. Per ristabilire l'ordine, è necessario rimuovere e ricreare la variabile.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Visualizzazione di tabelle hash
Per visualizzare una tabella hash salvata in una variabile, digitare il nome della variabile. Per impostazione predefinita, le tabelle hash vengono visualizzate come tabella con una colonna per le chiavi e una per i valori.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
Le tabelle hash hanno proprietà Keys e Values . Usare la notazione punto per visualizzare tutte le chiavi o tutti i valori.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
Ogni nome di chiave è anche una proprietà della tabella hash e il relativo valore è il valore della proprietà del nome della chiave. Usare il formato seguente per visualizzare i valori delle proprietà.
$hashtable.<key>
<value>
Ad esempio:
$hash.Number
1
$hash.Color
Blue
Le tabelle hash hanno una proprietà Count che indica il numero di coppie chiave-valore nella tabella hash.
$hash.count
3
Le tabelle hashtable non sono matrici, pertanto non è possibile usare un numero intero come indice nella tabella hash, ma è possibile usare un nome di chiave per indicizzare nella tabella hash. Se la chiave è un valore stringa, racchiudere il nome della chiave tra virgolette.
Ad esempio:
$hash["Number"]
1
Gestione dei conflitti di nomi di proprietà
Se il nome della chiave si scontra con uno dei nomi di proprietà del tipo HashTable, è possibile usare il membro intrinseco psbase per accedere a tali proprietà. Ad esempio, se il nome della chiave è keys
e si vuole restituire la raccolta delle chiavi HashTable , usare questa sintassi:
$hashtable.psbase.Keys
Questo vale per altri tipi che implementano l'interfaccia System.Collections.IDictionary , ad esempio OrderedDictionary.
Iterazione su chiavi e valori
È possibile scorrere le chiavi in una tabella hash per elaborare i valori in diversi modi. Ognuno degli esempi di questa sezione ha un output identico. Esegue l'iterazione sulla $hash
variabile definita qui:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Nota
In questi esempi viene $hash
definito come dizionario ordinato per garantire che l'output sia sempre nello stesso ordine. Questi esempi funzionano allo stesso modo per le normali tabelle hash, ma l'ordine dell'output non è prevedibile.
Ogni esempio restituisce un messaggio per ogni chiave e il relativo valore:
The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue
In questo esempio viene usato un blocco foreach per scorrere le chiavi.
foreach ($Key in $hash.Keys) {
"The value of '$Key' is: $($hash[$Key])"
}
Questo esempio usa ForEach-Object
per scorrere le chiavi.
$hash.Keys | ForEach-Object {
"The value of '$_' is: $($hash[$_])"
}
In questo esempio viene usato il metodo GetEnumerator per inviare ogni coppia chiave-valore tramite la pipeline a ForEach-Object
.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
Questo esempio usa i metodi GetEnumerator e ForEach per scorrere ogni coppia chiave-valore.
$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})
Aggiunta e rimozione di chiavi e valori
Per aggiungere chiavi e valori a una tabella hash, usare il formato di comando seguente.
$hash["<key>"] = "<value>"
Ad esempio, per aggiungere una chiave "Time" con un valore "Now" alla tabella hash, usare il formato di istruzione seguente.
$hash["Time"] = "Now"
È anche possibile aggiungere chiavi e valori a una tabella hash usando il Add
metodo dell'oggetto System.Collections.Hashtable . Il Add
metodo ha la sintassi seguente:
Add(Key, Value)
Ad esempio, per aggiungere una Time
chiave con un valore di Now
alla tabella hash, usare il formato di istruzione seguente.
$hash.Add("Time", "Now")
È inoltre possibile aggiungere chiavi e valori a una tabella hash usando l'operatore di addizione (+
) per aggiungere una tabella hash a una tabella hash esistente. Ad esempio, l'istruzione seguente aggiunge una Time
chiave con un valore alla Now
tabella hash nella $hash
variabile .
$hash = $hash + @{Time="Now"}
È anche possibile aggiungere valori archiviati nelle variabili.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
Non è possibile usare un operatore di sottrazione per rimuovere una coppia chiave-valore da una tabella hash, ma è possibile usare il metodo Remove dell'oggetto Hashtable . Il metodo Remove accetta la chiave come valore.
Il Remove
metodo ha la sintassi seguente:
Remove(Key)
Ad esempio, per rimuovere la Time=Now
coppia chiave-valore dalla tabella hash nel valore della $hash
variabile, digitare:
$hash.Remove("Time")
È possibile usare tutte le proprietà e i metodi degli Hashtable oggetti in PowerShell, tra cui Contains
, Clear
Clone
, e CopyTo
. Per altre informazioni sugli Hashtable oggetti, vedere System.Collections.Hashtable.
Tipi di oggetto nelle tabelle HashTable
Le chiavi e i valori di una tabella hash possono avere qualsiasi tipo di oggetto .NET e una singola tabella hash può avere chiavi e valori di più tipi.
L'istruzione seguente crea una tabella hash delle stringhe del nome del processo e elabora i valori dell'oggetto $p
e la salva nella variabile.
$p = @{
"PowerShell" = (Get-Process PowerShell)
"Notepad" = (Get-Process notepad)
}
È possibile visualizzare la tabella hash in $p
e usare le proprietà key-name per visualizzare i valori.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
PS> $p.PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
441 24 54196 54012 571 5.10 1788 PowerShell
PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251
Le chiavi in una tabella hash possono essere di qualsiasi tipo .NET. L'istruzione seguente aggiunge una coppia chiave-valore alla tabella hash nella $p
variabile . La chiave è un oggetto Service che rappresenta il servizio WinRM e il valore è lo stato corrente del servizio.
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
È possibile visualizzare e accedere alla nuova coppia chiave-valore usando gli stessi metodi usati per altre coppie nella tabella hash.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
Anche le chiavi e i valori in una tabella hash possono essere Hashtable oggetti. L'istruzione seguente aggiunge una coppia chiave-valore alla tabella hash nella $p
variabile in cui la chiave è una stringa, Hash2 e il valore è una tabella hash con tre coppie chiave-valore.
$p = $p + @{
"Hash2"= @{a=1; b=2; c=3}
}
È possibile visualizzare e accedere ai nuovi valori usando gli stessi metodi.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Hash2 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
PS> $p.Hash2
Name Value
---- -----
a 1
b 2
c 3
PS> $p.Hash2.b
2
Ordinamento di chiavi e valori
Gli elementi di una tabella hash sono intrinsecamente non ordinati. Le coppie chiave-valore potrebbero essere visualizzate in un ordine diverso ogni volta che vengono visualizzate.
Sebbene non sia possibile ordinare una tabella hash, è possibile usare il metodo GetEnumerator delle tabelle hash per enumerare le chiavi e i valori e quindi usare il Sort-Object
cmdlet per ordinare i valori enumerati per la visualizzazione.
Ad esempio, i comandi seguenti enumerare le chiavi e i valori nella tabella hash nella $p
variabile e quindi ordinare le chiavi in ordine alfabetico.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (pwsh)
WinRM Running
Il comando seguente usa la stessa procedura per ordinare i valori hash in ordine decrescente.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {[a, 1], [b, 2], [c, 3]}
WinRM Running
Creazione di oggetti da tabelle hash
A partire da PowerShell 3.0, è possibile creare un oggetto da una tabella hash di proprietà e valori di proprietà.
La sintassi è la seguente:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Questo metodo funziona solo per le classi con un costruttore senza parametri. Le proprietà dell'oggetto devono essere pubbliche e impostabili.
Per altre informazioni, vedere about_Object_Creation.
ConvertFrom-StringData
Il ConvertFrom-StringData
cmdlet converte una stringa o una stringa here-value di coppie chiave-valore in una tabella hash. È possibile usare il ConvertFrom-StringData
cmdlet in modo sicuro nella sezione Dati di uno script ed è possibile usarlo con il Import-LocalizedData
cmdlet per visualizzare i messaggi utente nelle impostazioni cultura dell'interfaccia utente dell'utente corrente.
Le stringhe qui sono particolarmente utili quando i valori nella tabella hash includono virgolette. Per altre informazioni sulle stringhe qui, vedere about_Quoting_Rules.
Nell'esempio seguente viene illustrato come creare una stringa here dei messaggi utente nell'esempio precedente e come usarli ConvertFrom-StringData
da una stringa in una tabella hash.
Il comando seguente crea una stringa here delle coppie chiave-valore e quindi la salva nella $string
variabile .
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Questo comando usa il ConvertFrom-StringData
cmdlet per convertire la stringa here in una tabella hash.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Per altre informazioni sulle stringhe qui, vedere about_Quoting_Rules.