Project

General

Profile

Function Set-Constant

Function Set-Constant( [String] $Variablename, 
                       [Hashtable] $Data, 
                       [String] $Description, 
                       [Int32] $Scope=1,
                       [Switch] $RemoveAddMethod)

PowerShell ne propose pas de notion de constante similaire aux langages de programmation statique à part de déclarer une variable avec

Set-Variable -option constant

Dans ce cas les variables de type valeur : entier, string, boolean,etc seront effectivement en lecture seule tout comme un objet, on ne peut pas lui affecter un nouvel objet, en revanche pour celui-ci ces propriétés restent modifiables.

On peut simplifier la gestion des constantes en utilisant une hashtable mais ces valeurs restent en lecture/écriture.

J'ai eu besoin pour les scripts de gestion des API Win32 d'une structure déclarant des constantes sans avoir à déclarer autant ligne, avec Set-Variable, que de constantes nécessaires. De plus la déclaration d'une variable se fait dans la portée courante.

Cette fonction couple l'usage du cmdlet Set-Variable à la création d'un objet personnalisé contenant des propriétés en lecture seule.
Elle évite d'une part d'avoir une liste de variable globales en expansion et d'autre part de s'assurer que les valeurs devant être constantes le sont et le reste.
L'objet renvoyé contient également une fonction Add et une propriété Name qui est le nom de la variable que l'objet héberge.
La fonction Add facilite la saisie, au lieu de la déclaration suivante :

$cApiWindows.SWP_NOSIZE + $cApiWindows.SWP_NOMOVE + $cApiWindows.SWP_NOZORDER`
 + $cApiWindows.SWP_NOACTIVATE + $cApiWindows.SWP_SHOWWINDOW

On saisie simplement :
$cApiWindows.Add("SWP_NOSIZE","SWP_NOMOVE","SWP_NOZORDER","SWP_NOACTIVATE","SWP_SHOWWINDOW")

Exemple :
Crée une variable constante de nom $VariableName dans la portée de l'appelant.
La variable est créée par défaut dans la portée de l'appelant, sinon dans celle précisée par $Scope

 $Const=@{
  NomConstante=[Intptr] 567}
 Set-Constant "cConst" $Const "Constantes test" 

  #Pour chaque entrée de la hashtable $DATA on crée un membre de type ScriptProperty en lecture seule :
 cConst.NomConstante {get=[System.IntPtr] 567;set=Throw "La propriété NomConstante est en lecture seule.";}

  #Pour retrouver les constantes : 
 dir variable:c*|Where { (gv $_.name).options -match "constant"}