Condividi tramite


about_Hash_Tables

Breve descrizione

Descrive come creare, usare e ordinare le tabelle hash in PowerShell.

Descrizione lunga

Una tabella hash, nota anche come matrice di dizionario o 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 cui 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 spesso stringhe o 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 viene spesso usato perché è efficiente per trovare e recuperare i dati. È possibile usare le tabelle hash per archiviare gli elenchi e 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:

  • Avviare 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 che contengono 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 lo si inserisce 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 quando lo si crea. 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 è 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 le tabelle hash. È possibile usare un tipo 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 ha esito negativo 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 [ordinato].

$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, viene visualizzata una 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à Chiavi e valori . 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 della chiave è anche una proprietà della tabella hash e il relativo valore è il valore della proprietà nome 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, quindi non è possibile usare un intero come indice nella tabella hash, ma è possibile usare un nome 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 delle collisioni dei nomi delle proprietà

Se il nome della chiave si scontra con uno dei nomi di proprietà del tipo HashTable, è possibile usare il membro intrinsecopsbase 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 eseguire l'iterazione delle 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 della $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 eseguire l'iterazione delle chiavi.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

Questo esempio usa ForEach-Object per eseguire l'iterazione delle 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)"
}

In questo esempio vengono usati i metodi GetEnumerator e ForEach per eseguire l'iterazione su 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 dell'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 chiave con un Time valore di alla tabella hash, usare il formato dell'istruzione Now seguente.

$hash.Add("Time", "Now")

È inoltre possibile aggiungere chiavi e valori a una tabella hash usando l'operatore di aggiunta (+) per aggiungere una tabella hash a una tabella hash esistente. Ad esempio, l'istruzione seguente aggiunge una Time chiave con un valore di Now alla tabella hash nella $hash variabile.

$hash = $hash + @{Time="Now"}

È anche possibile aggiungere valori archiviati in 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 di Hashtable oggetti in PowerShell, tra cui Contains, ClearClone, e CopyTo. Per altre informazioni sugli Hashtable oggetti, vedere System.Collections.Hashtable.

Tipi di oggetti in HashTable

Le chiavi e i valori in 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 e la salva nella $p variabile.

$p = @{
    "PowerShell" = (Get-Process PowerShell)
    "Notepad" = (Get-Process notepad)
}

È possibile visualizzare la tabella hash in $p e usare le proprietà nome chiave 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 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

Le chiavi e i valori in una tabella hash possono anche essere Hashtable oggetti. L'istruzione seguente aggiunge la coppia chiave-valore alla tabella hash nella variabile in $p 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                          {[b, 2], [c, 3], [a, 1]}
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.Hash2

Name                           Value
----                           -----
b                              2
c                              3
a                              1

PS> $p.Hash2.b
2

Ordinamento di chiavi e valori

Gli elementi in una tabella hash sono intrinsecamente non ordinati. Le coppie chiave-valore potrebbero essere visualizzate in un ordine diverso ogni volta che vengono visualizzate.

Anche se non è 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 enumerano le chiavi e i valori nella tabella hash della $p variabile e quindi ordinano le chiavi in ordine alfabetico.

PS> $p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Hash2                          {[b, 2], [c, 3], [a, 1]}
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                          {[b, 2], [c, 3], [a, 1]}
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 che dispongono di un costruttore senza parametri. Le proprietà dell'oggetto devono essere pubbliche e impostate.

Per altre informazioni, vedere about_Object_Creation.

ConvertFrom-StringData

Il ConvertFrom-StringData cmdlet converte una stringa o una stringa qui di coppie chiave-valore in una tabella hash. È possibile usare il ConvertFrom-StringData cmdlet in modo sicuro nella sezione Dati di uno script e usarlo con il Import-LocalizedData cmdlet per visualizzare i messaggi utente nelle impostazioni cultura dell'interfaccia utente dell'utente corrente.

Le stringhe di seguito 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 qui dei messaggi utente nell'esempio precedente e come usarli ConvertFrom-StringData da una stringa in una tabella hash.

Il comando seguente crea una stringa qui 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 cmdlet per convertire la ConvertFrom-StringData stringa qui 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