Buongiorno a tutti e benvenuti in un nuovo POST del mio blog:
“Lo scriptomane”
Oggi parliamo di un bellissimo costrutto del linguaggio
powershell: le hash table (o hashtable, le chiamano tutti in entrambi i modi).
Le hash tables sono delle array associative in powershell.
Quindi sono delle array con un indice non numerico, ma che può essere testuale,
senza un ordine prefissato (salvo creare una [ordered] hashtable, vedere link
di approfondimento + avanti), ma che accetta l’inserimento di variabili associate
ad un index (o chiave, key).
In powershell le hash tables non sono un tipo di variabile,
ma ognuna di esse è un’istanza dell’oggetto System.Collections.Hashtable ed è
quindi possibile richiamare ed utilizzare i metodi di quest’oggetto.
Per approfondire potete andare sul sito di microsoft
qui.
La sintassi delle hashtable è questa:
@{ = ;
[ = ] ...}
Sicchè, come avrete capito, vi possono essere infinite
coppie di chiave – valore.
Quest’oggetto veramente interessante di powershell ha una
caratteristica molto potente:
Ogni valore può
essere qualsiasi cosa: un’oggetto, un’istanza di oggetto, una variabile, un’altra
hashtable, etc… INOLTRE ogni chiave, a sua volta, può essere qualsiasi cosa
(questo non molti lo immaginano), con poche limitazioni che ne derivano.
In questo senso assomigliano moltissimo alle array di PHP
(altro linguaggio a me caro).
Stando così le cose, mi sembra chiaro che, con un po’ di
fantasia, è possibile creare oggetti per stoccare ordinatamente un po’
qualsiasi cosa, davvero con pochissime limitazioni.
Come creare una Hash Table in powershell
A questo punto, direi di vedere come si crea una Hash Table.
La sintassi è semplicissma:
$toMap =
@{}
In questo modo avremo creato una hash table vuota. Oppure
$toMap =
@{“chiave”=”valore”; “chiave2”=”valore2”}
… per creare una HashTable già “popolata”.
Come inserire un valore nuovo in una Hash Table in powershell
La sintassi è veramente semplice, si usano le parentesi
quadre, indicando la chiave.
$toMap["chiaveNuova"]="valore" # con chiave testuale e
valore testuale
$toMap["chiaveNuovissima"]=$user # con chiave testuale e
valore oggetto o variabile
$toMap[$user]="prova" # con chiave oggetto o variabile e valore testuale
Se l’indice era già presente all’interno della Hash Table, il
valore che viene indicato verrà sostituito, se invece non era presente, il
nuovo elemento verrà aggiunto.
Come recuperare un valore da una HashTable in powershell
Ed ecco che, una volta inseriti i valori vogliamo
recuperarli… questo è semplicissimo e si può fare con
$toMap["chiaveNuova"]
Ma ecco che c’è subito una casistica particolare e
interessante: se usiamo, come chiave, un oggetto, possiamo recuperare il valore
anche utilizzando un oggetto identico?
Vi faccio un esempio: da una parte devo usare una hash per
immagazzinare determinati parametri di configurazione per un utente, quindi uso
l’utente come chiave e il valore sarà un’altra hash table.
Giacché poi ciclo e recupero gli utenti, inserendoli in
variabile, posso recuperare i valori di configurazione precedentemente
immagazzinati?
Ecco qui un’immagine che vi farà capire meglio cosa intendo:
come vedete, purtroppo, le istanze degli oggetti ADUser non
sono IDENTICHE in tutto e per tutto, quindi non possiamo usare questo tipo di
oggetto per recuperare un valore da una chiave rappresentata da un’istanza di
ADUser dello stesso utente.
Tuttavia, se gli oggetti sono IDENTICI, allora è possibile.
Guardate quest’immagine:
… per oggi Finisco qui, dedicherò un approfondimento a
brevissimo su come si può ciclare su di un oggetto HashTable.
Happy
Scripting a Tutti!