martedì 18 aprile 2017

TUTORIAL POWERSHELL - PARTE 7 - MODULI

Tutorial introduttivo all'utilizzo di PowerShell, a prima vista una estensione del prompt dei comandi di Microsoft Windows ma che in realtà è molto di più.






Lista completa articoli su Tutorial PowerShell [link]

Moduli

Nel precedente articolo [link] abbiamo visto come realizzare delle funzioni; può diventare utile incapsularle tutte in una sorta di libreria. In PowerShell le librerie vengono chiamate Moduli. Un Modulo è un file di testo, identico a quanto abbiamo visto con gli Script, ma con estensione PSM1 (i moduli sono stati introdotti in PowerShell 2.0).

Una volta scritto il modulo è necessario effettuare una importazione attraverso il cmdlet Import-Module. Esempio: se volessimo creare un modulo che abbia al suo interno due funzioni matematiche, una di somma e l'altra di sottrazione, dovremmo utilizzare il seguente comando (il file si chiama AddSub.psm1):
function Get-Add{
    Param([int]$a,[int]$b)
    return $a+$b
}
function Get-Sub{
    Param([int]$a,[int]$b)
    return $a-$b
}
Import-Module .\AddSub.psm1

Analogamente al cmdlet di importazione, è possibile rimuovere un modulo utilizzando il cmdlet Remove-Module seguito dal solo nome del file del modulo (senza path o estensione), anche se deve essere ricordato che i moduli sono mantenuti fintanto che esiste la sessione PowerShell che li ha importati.

Esposizione dei Moduli

Vi ricordate il cmdlet Get-Command visto in un articolo precedente [link]? Get-Command ha la funzione di comunicare la lista dei cmdlet utilizzabili all'interno della sessione PowerShell. Una volta importato un modulo, i suoi cmdlet saranno presenti nell'output di Get-Command.

Tuttavia, come abbiamo già visto per gli Script [link], anche per i moduli vale la regola che lo scope è circoscritto. Questo non è un problema tanto per le variabili (non ha senso realizzare un modulo e poi dover accedere alle variabili al suo interno, meglio optare per un valore di ritorno), è un problema per quanto riguarda l'esposizione delle funzioni.

Di default, un modulo:
  • Espone le funzioni
  • Non Espone le variabili
  • Non Espone gli alias
Tipicamente nella programmazione, quando viene realizzata una libreria al suo interno si trovano anche funzioni private, utilizzate internamente, che non devono essere visibili dal codice che le utilizza. Per limitare quali funzioni vengano esposte dal modulo è necessario utilizzare il cmdlet Export-ModuleMember all'interno del modulo e selezionare una ad una le funzioni da esporre. 

Esempio: se del modulo precedente volessimo esporre solo la funzione Get-Add:
function Get-Add{
    Param([int]$a,[int]$b)
    return $a+$b
}
function Get-Sub{
    Param([int]$a,[int]$b)
    return $a-$b
}
Export-ModuleMember -function Get-Add

Caricare automaticamente i Moduli

Può essere utile, una volta realizzato un modulo di funzioni personalizzate, avere la necessità di averlo sempre a disposizione in ogni sessione PowerShell, senza doverlo importare ogni volta. Esiste una variabile d'ambiente chiamata PSMODULEPATH che contiene la lista dei path dove sono contenuti i moduli di sistema, inserendo un file PSM1 all'interno di una di queste directory è possibile far auto caricare i moduli ad ogni avvio di una sessione PowerShell.


Volendo è possibile anche disabilitare il caricamento automatico di moduli, attraverso l'impostazione della variabile $PSModuleAutoloadingPreference a "none".
$PSModuleAutoloadingPreference none

Riferimenti ad altri moduli

Una volta realizzati alcuni moduli, potrebbe nascere la necessità di utilizzare funzioni di un modulo all'interno di un altro modulo. Per fare questo è possibile procedere in due modi:
  • inserire all'interno del modulo utilizzatore, il cmdlet Import-Module. Soluzione altamente sconsigliata, che potrebbe portare ad importazioni ricorsive.
  • inserire all'interno del modulo utilizzatore, la sintassi #requires. Soluzione migliore ma limitata alla importazione di moduli "standard", infatti per importare moduli personalizzati è necessario che abbiamo un file Manifest.
Sinceramente l'utilità di importare moduli personalizzati all'interno di altri moduli personalizzati non l'ho mai trovata ma, se siete interessati, vi consiglio la lettura dell'help:
Get-Help about_requires

Conclusione

Abbiamo visto come impacchettare le Funzioni che abbiamo realizzato in Moduli. Nel prossimo articolo [link] torneremo sul tema degli Oggetti in riferimento al Framework .Net.

Nessun commento:

Posta un commento