martedì 12 febbraio 2019

Le potenti hash table di powershell - episodio 2


Buongiorno e benvenuti a questo secondo ed ultimo episodio di questa mini-serie dedicata alle hash table di Powershell.
In questa “puntata” dedicherò un po’ di tempo ai possibili modi di interagire ciclicamente con una hashtable.
Se non avete letto il primo episodio di questa mini-serie, vi consiglio di andare a leggervelo qui.
Detto questo, mettiamoci all’opera.

Ciclare su una hash table – non così diretto

Come potete notare, una hashtable non è una collection di oggetti nuda e cruda, ma ogni voce della hashtable ha un nome e un valore.




Come vedete dalle prove che  ho fatto in questa immagine, non è possibile NEMMENO richiamare la proprietà Name o Value di ogni foreach, mentre è necessario utilizzare il metodo getEnumerator()

GetEnumerator() … …con qualche limite

Ecco quindi venirci in aiuto il GetEnumerator che, tuttavia, impone qualche limite sull’uso di oggetti come chiave. Vedete nell’immagine sopra che, quando il ciclo è arrivato sul punto in cui la chiave è un oggetto , lo script è andato in errore…
Quindi va benissimo usare questo sistema con hashtable testuali, ma quando abbiamo chiavi particolari, meglio usare il metodo che segue…

Il metodo migliore, secondo me: usiamo il metodo .Keys

Con il metodo .Keys della classe HashTable, otteniamo un array di tutte le chiavi. Utilizzando poi la notazione con le parentesi quadre per recuperare i valori dalla array, possiamo ciclare in tutta libertà sulla nostra hashtable.







Bene! Anche per oggi spero di aver stuzzicato la vostra voglia di scriptare e la vostra fantasia.
Happy Scripting a tutti!

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!

venerdì 8 febbraio 2019

Utilizzare una funzione definita in un file di Powershell


Buongiorno a tutti e benvenuti nuovamente nel mio blog!
Capita spesso, in programmazione e così anche negli script, di creare delle funzioni generiche che ci piacerebbe riutilizzare.

Nei linguaggi di scripting, tuttavia, non sempre è intuitivo capire come “includere” le definizioni di funzioni: ogni linguaggio ha il suo “dialetto”…

Ecco, in breve, come sfruttare questa buona pratica di programmazione, il riutilizzo del codice, con powershell.

Supponiamo, ad esempio, di aver scritto questa funzione dentro un file “FUNZIONI.ps1”:

function echoMyName($user){
      write-host "Ciao, $($user.Name), questo e' il tuo nome e quest'altro e' il tuo ufficio: $($user.Office) "
}

… e di volerla riutilizzare per la nostra amministrazione via powershell o in nuovi script, per riutilizzo del codice (ottima pratica).
Quindi? Ecco qui di seguito alcuni trick per farlo:

Richiamare una function dal file da linea di comando shell

È presto fatto, basta ricordarsi una notazione un po’ particolare. Dobbiamo cominciare con una & e una parentesi graffa, dentro quest’ultima un punto prima del percorso del file che contiene la funzione, quindi il percorso, un punto e virgola (che separa il comando successivo) e
·         La & serve per indicare a powershell che stiamo per eseguire un comando.
·         La parentesi graffa serve per “racchiudere” i comandi in un unico “set di comandi”.
·         Il punto serve per indicare che vogliamo “eseguire” il file PS1 (che conterrà solo definizioni di funzione, quindi non avrà alcun output).
Mi raccomando lo spazio tra il primo punto e il percorso del file
Come di seguito:

& { ..\Funzioni.ps1”;  echoMyName((get-aduser DiegoC))}



Come usare una funzione powershell scritta in un file, su di un loop

Per utilizzare una funzione powershell da un file, però sugli oggetti di un loop, magari i risultati in una collection derivanti da un comando che  abbiamo lanciato.
Per farlo è sufficiente includere i comandi dentro le graffe all’interno di quelle del foreach o del for, così:
get-Aduser -Filter*| foreach { ..\Funzioni.ps1”;  echoMyName($_) }



Come includere un file .ps1 che contiene delle funzioni

Per includere ed usare, in uno script powershell, delle funzioni che avete definito in UN ALTRO file…
È sufficiente usare questa notazione:
. ".\FUNZIONI.ps1"
Da quel momento in avanti potrete usare le funzioni che avete scritto


Bene, spero di aver solleticato anche oggi un po’ la vostra fantasia…
Happy Scripting a tutti!