Una guida per principianti all’uso di PowerShell Hashtable

Incontrando le hashtable per la prima volta, potresti chiederti cosa sono e come svolgono un ruolo cruciale nei tuoi script o comandi. Non preoccuparti! Questo tutorial ti spiegherà come iniziare ad utilizzare le hashtable in PowerShell.

In poche parole, le hashtable ti permettono di memorizzare e manipolare dati utilizzando coppie chiave-valore, che possono essere accessibili in modo rapido ed efficiente. In questo tutorial imparerai i concetti di base delle hashtable e come utilizzarle nei tuoi script e comandi PowerShell.

Continua a leggere e inizia ad ampliare le tue competenze con le hashtable in PowerShell!

Prerequisiti

Questo tutorial sarà una dimostrazione pratica. Per seguirlo, assicurati di avere un sistema con PowerShell v5+ installato e configurato. Questo tutorial utilizza Windows 10 con PowerShell 7, ma altre versioni di PowerShell e Windows funzioneranno.

Creazione di una hashtable in PowerShell

Trovare dati specifici può diventare una situazione “ago nel pagliaio” a volte. Ma con le hashtable, puoi cercare rapidamente elementi particolari in una vasta collezione di dati.

In PowerShell, le hashtable sono strutture dati flessibili utilizzate in molti modi, come memorizzare dati di configurazione, passare argomenti ai cmdlet e memorizzare dati in uno script.

Per vedere come funziona una hashtable in PowerShell, dovrai prima crearne una come segue:

1. Apri una sessione di PowerShell e esegui il seguente comando, che non produce output ma dichiara una variabile chiamata name per fare riferimento a un hashtable vuoto.

Come puoi vedere di seguito, simile agli array in PowerShell, gli hashtable sono definiti utilizzando il simbolo @.

$name = @{}

2. Successivamente, esegui il seguente comando per verificare il tipo della variabile name (GetType()).

$name.GetType()

Il tipo della variabile name è Hashtable, come mostrato di seguito. Questa informazione conferma che il tuo hashtable è stato creato con successo.

Verifying the newly-created hashtable

3. Dopo aver verificato il tuo hashtable, esegui il seguente codice per controllare se l’hashtable è vuoto o meno.

Il codice di seguito determina se la proprietà Count è uguale (-eq) a 0 e stampa un messaggio corrispondente.

# Confronta se il valore della proprietà Count è uguale (-eq) a 0
if ($name.Count -eq 0) {
	# Se sì, stampa il messaggio di seguito.
  Write-Output "The hashtable is empty."
} else {
	# Altrimenti, stampa il messaggio di seguito invece.
  Write-Output "The hashtable is not empty."
}

Di seguito, puoi vedere che la tabella hash è vuota poiché è stata appena creata e non sono stati definiti coppie chiave-valore al suo interno.

Checking if the hashtable is empty or not

Aggiunta di elementi a una tabella hash di PowerShell

Hai appena creato una tabella hash di PowerShell praticamente vuota, che può essere utile solo se aggiungi elementi. Come? Aggiungendo coppie chiave-valore alla tabella hash.

Simile a un array, ma invece di utilizzare interi come indici, una tabella hash di PowerShell utilizza chiavi (che possono essere di qualsiasi tipo di dato) per identificare i valori. Questa caratteristica consente l’inserimento, il recupero e l’eliminazione rapida degli elementi dalla tabella hash, poiché la chiave individua rapidamente il valore corrispondente.

Di seguito è riportata la sintassi per aggiungere una coppia chiave-valore a una tabella hash di PowerShell, dove:

  • $hashtable – Il nome della tabella hash.
  • $key – Il nome della chiave, che è case-insensitive. Ad esempio, “Nome” e “nome” sarebbero considerate la stessa chiave in una tabella hash
  • $value – Il valore da associare alla chiave.
$hashtable[$key] = $value

Esegui il seguente codice, che non produce output sulla console, ma dichiara coppie chiave-valore e le aggiunge alla tua tabella hash ($name).

In una tabella hash, la chiave ti consente di eseguire una funzione hash, che mappa la chiave in una posizione specifica nella struttura dati interna della tabella hash.

? I valori della tabella hash possono essere di qualsiasi tipo, come numeri, stringhe, array, oggetti e altri tipi di dati come valori in una tabella hash.

# Dichiarare la chiave Nome
$key = "FirstName"
# Dichiarare il valore della chiave
$value = "John"
# Aggiungere l'elemento alla hashtable
$name[$key] = $value

# Dichiarare la chiave Cognome
$key = "LastName"
# Dichiarare il valore della chiave
$value = "Doe"
# Aggiungere l'elemento alla hashtable
$name[$key] = $value

Ora, eseguire nuovamente il codice di seguito per verificare se la tua hashtable è vuota.

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

Come mostrato di seguito, riceverai un messaggio che indica che la hashtable non è vuota questa volta.

Checking if the hashtable is empty or not

Recupero degli elementi da una hashtable di PowerShell

Supponendo che tu sia sicuro che la tua hashtable non sia vuota. Come fai a sapere quali elementi esistono nella tua hashtable? Fortunatamente, puoi anche recuperare gli elementi dalla tua hashtable.

Esegui il codice di seguito per recuperare e stampare (Write-Output) tutti gli elementi dalla tua hashtable in coppie chiave-valore, uno per riga.`

# Itera attraverso tutte le coppie chiave-valore nella hashtable
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # Stampa tutte le coppie chiave-valore nella hashtable, una per riga.
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

Ora, esegui il codice di seguito per recuperare e stampare (Write-Output) tutti gli elementi di una hashtable sulla console.

? Nota che userai spesso il seguente codice in questo tutorial. Puoi evitare di copiare e incollare lo stesso codice più volte creando una funzione, ma questo è al di fuori dello scopo di questo tutorial.

# Ottieni un oggetto che può essere usato per iterare sugli elementi di una collezione.
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# Restituisce una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Questa volta, puoi vedere le indicazioni su quali sono le chiavi e i valori tra gli elementi elencati.

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

Creazione di hashtable con valori predefiniti

Fino ad ora, hai solo guardato alla creazione di hashtable vuote. Ma se sai che certi valori saranno sempre necessari nel tuo hashtable, puoi crearne uno con valori predefiniti.

Hashtable con valori predefiniti possono risparmiarti tempo e rendere il tuo codice più efficiente, poiché non devi aggiungere i valori all’hashtable in seguito.

? Nota che la creazione di hashtable non produce output. Ma non preoccuparti. In questo tutorial, verificherai ogni hashtable dopo la creazione.

1. Esegui il seguente comando per creare un hashtable ($hashtable1) con tre coppie chiave-valore.

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. Successivamente, esegui il seguente codice per verificare l’esistenza del nuovo hashtable (hashtable1).

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # Stampa una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Vedrai che i valori per ogni coppia chiave-valore vengono stampati a schermo come previsto. Questo output conferma che i valori predefiniti sono memorizzati nelle posizioni appropriate nell’hashtable.

Verifying that hashtable was created successfully with predefined values

3. Ora, esegui il codice sottostante per creare un hashtable ($hashtable2) con valori predefiniti utilizzando un ciclo (o un array).

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. Infine, esegui il codice sottostante per verificare che il nuovo hashtable (hashtable2) sia stato creato con successo.

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# Stampa una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

L’output sottostante conferma che il metodo del ciclo funziona quando si crea un hashtable con valori predefiniti. Tuttavia, poiché gli elementi sono elencati in modo casuale, passa alla sezione successiva per una soluzione.

Verifying the new hashtable was created successfully

Creazione di una lista ordinata di elementi negli hashtable

Per impostazione predefinita, gli elementi in un hashtable vengono memorizzati senza un ordine specifico. Ma cosa fare se hai bisogno di una lista ordinata? Puoi anche creare una lista ordinata di elementi nei tuoi hashtable per organizzare i dati in un ordine specifico.

Per creare una lista ordinata di elementi nel tuo hashtable, utilizza l’attributo [ordered] come segue:

1. Esegui il seguente codice per creare una lista [ordered] di elementi in una hashtable ($hashtable3).

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. Successivamente, esegui il seguente codice per verificare che la lista ordinata di hashtable sia stata creata con successo.

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Restituisce una stringa che include la chiave e il valore di ogni elemento della collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Come mostrato di seguito, gli elementi elencati rimangono nell’ordine in cui li hai definiti quando hai creato la hashtable.

Alcuni possibili vantaggi nell’utilizzo di una hashtable ordinata includono, ma non sono limitati a, quanto segue:

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. Infine, chiama la tua hashtable ordinata ($hashtable3) per confermare ulteriormente che otterrai comunque una lista ordinata di elementi.

$hashtable3

L’output qui sotto conferma che otterrai comunque una lista ordinata di elementi, indipendentemente da come accedi alla tua hashtable.

Verifying the list of items is still in an ordered format

Aggiornamento degli elementi esistenti nelle hashtable

I dati cambiano costantemente e se hai delle hashtable esistenti, aggiornarle è un’operazione cruciale. Ad esempio, stai utilizzando una hashtable per memorizzare i valori di configurazione. In tal caso, potresti dover aggiornare il valore di una chiave se la configurazione cambia.

Per aggiornare una hashtable di PowerShell, l’operatore di assegnazione = farà al caso tuo come segue:

1. Esegui il comando seguente, che non fornisce un output, ma aggiorna il valore della chiave Key2 in $hashtable3 con NewValue2.

$hashtable3["Key2"] = "NewValue2"

Successivamente, eseguire il comando seguente per Add() aggiungere una nuova coppia chiave-valore (Key4 = NewValue4) all’ hashtable ($hashtable3).

Aggiungere una nuova coppia chiave-valore non produce un output come l’aggiornamento delle liste esistenti negli hashtable, ma verificherai le modifiche nel passaggio successivo.

$hashtable3.Add("Key4", "NewValue4")

3. Esegui il codice seguente per verificare che i valori delle chiavi nel tuo hashtable ($hashtable3) siano stati aggiornati.

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Restituisce una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? In PowerShell, ogni chiave in un hashtable deve essere unica. Se provi ad aggiungere una coppia chiave-valore già presente nell’ hashtable, otterrai un errore come quello riportato di seguito. Per evitare di ottenere questo errore, passa al passaggio successivo.

Adding a key that already exists

4. Ora, esegui il codice seguente, che utilizza il metodo Contains() per verificare se la chiave che stai cercando di aggiungere esiste già nell’ hashtable prima di aggiungere la coppia chiave-valore.

# Definisci la variabile per contenere la nuova chiave
$newkey="Key5"
# Verifica se $newkey esiste già nell' hashtable.
if (-not $hashtable3.Contains($newkey)) {
	# Se non esiste, aggiungi la nuova coppia chiave-valore.
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# Se la chiave esiste, stampa un messaggio.
	Write-Output "The key '$newkey' already exists."
}

Se la nuova chiave non esiste, otterrai il messaggio sottostante, che dice che la nuova chiave è stata aggiunta all’ hashtable.

Checking if a key exists before adding it to the hashtable

Altrimenti, come mostrato di seguito, riceverai un messaggio se la chiave che stai cercando esiste già.

Adding a key that already exists

5. Infine, eseguire di nuovo il codice di seguito per recuperare tutti gli elementi nella tua hashtable ($hashtable3).

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Restituisce una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Di seguito, puoi vedere la nuova chiave aggiunta (Chiave5) e gli altri elementi che hai aggiunto finora alla hashtable.

Checking all items listed in a hashtable

Rimuovere elementi da una Hashtable

Troppi elementi in una hashtable, specialmente quelli non necessari, possono solo portare confusione. Rimuovere gli elementi che non sono più rilevanti o necessari dalla tua hashtable ti sarà di aiuto.

Supponiamo che la tua hashtable contenga una lista di utenti e le loro informazioni. In tal caso, rimuovi gli utenti dalla tua hashtable se non sono più attivi.

Esegui il codice di seguito per rimuovere un elemento specifico (Chiave1) dalla tua hashtable ($hashtable3).

$key = "Key5"
if ($hashtable3.Contains($key)) {
  $hashtable3.Remove($key)
  Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
  Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}

Di seguito, l’output stampa un messaggio che indica che la chiave è stata rimossa. Ma se la chiave non esiste, riceverai un messaggio che indica che la chiave non è stata trovata.

Removing items from a hashtable

Ora, esegui il seguente codice per controllare tutti gli elementi nella tua hashtable e verificare se l’eliminazione dell’elemento è stata effettuata con successo.

# Ottieni un oggetto che può essere utilizzato per iterare sugli elementi di una collezione.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Restituisce una stringa che include la chiave e il valore di ogni elemento nella collezione.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Di seguito, puoi verificare che la coppia chiave-valore con chiave ‘Key5’ non esiste più nella tua hashtable.

Verifying item deletion is successful

Conclusioni

Con una struttura chiave-valore e un accesso rapido, una hashtable di PowerShell è ben adatta per gestire grandi quantità di dati in vari scenari. E in questo tutorial, hai imparato come creare, aggiungere, aggiornare ed eliminare elementi dalle hashtable. Tutto questo ti fornisce le competenze per utilizzare le hashtable in modo efficace nei tuoi script.

Perché non portare le tue nuove competenze al livello successivo? Considera l’incorporazione delle hashtable nei tuoi script per compiti più avanzati, come la manipolazione dei dati e la trasformazione. Oppure sperimenta l’uso delle hashtable in combinazione con altre strutture di dati in PowerShell, come array e oggetti, per risolvere problemi più complessi?

Source:
https://adamtheautomator.com/powershell-hashtable/