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 psbaseper 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, ClearClone, 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.

Vedi anche