domenica 10 febbraio 2019

Le potenti hash table di powershell - episodio 1


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!

Nessun commento:

Posta un commento

I commenti sono soggetti a moderazione, prima di essere pubblicati.

Qualsiasi contenuto illecito, immorale o che io ritenga (arbitrariamente) offensivo od inappropriato, verrà cancellato.