Je voudrais déclarer des constantes entières dans PowerShell.
Y a-t-il un bon moyen de le faire ?
Je voudrais déclarer des constantes entières dans PowerShell.
Y a-t-il un bon moyen de le faire ?
Utilisez
Set-Variable test -Option Constant -Value 100
ou
Set-Variable test -Option ReadOnly -Value 100
La différence entre "Constant" et "ReadOnly" est qu'une variable en lecture seule peut être supprimée (et ensuite recréée) via
Remove-Variable test -Force
alors qu'une variable constante ne peut pas être supprimée (même avec -Force).
Voir cet article de TechNet pour plus de détails.
Hmm, mais comment forcer le type de données lors de l'utilisation de Set-Variable
? Lorsqu'on traite des variables, on peut utiliser [string]$name = value
mais cela ne semble pas être possible pour les constantes ?
@Monso Vous avez besoin de parenthèses autour de la valeur lorsque vous spécifiez le type, par exemple ([string]100)
. Voir les réponses ci-dessous.
Voici une solution pour définir une constante comme celle-ci :
const myConst = 42
Solution tirée de http://poshcode.org/4063
function Set-Constant {
<#
.SYNOPSIS
Creates constants.
.DESCRIPTION
This function can help you to create constants so easy as it possible.
It works as keyword 'const' as such as in C#.
.EXAMPLE
PS C:\> Set-Constant a = 10
PS C:\> $a += 13
There is a integer constant declaration, so the second line return
error.
.EXAMPLE
PS C:\> const str = "this is a constant string"
You also can use word 'const' for constant declaration. There is a
string constant named '$str' in this example.
.LINK
Set-Variable
About_Functions_Advanced_Parameters
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, Position=0)]
[string][ValidateNotNullOrEmpty()]$Name,
[Parameter(Mandatory=$true, Position=1)]
[char][ValidateSet("=")]$Link,
[Parameter(Mandatory=$true, Position=2)]
[object][ValidateNotNullOrEmpty()]$Mean,
[Parameter(Mandatory=$false)]
[string]$Surround = "script"
)
Set-Variable -n $name -val $mean -opt Constant -s $surround
}
Set-Alias const Set-Constant
Malheureusement, cela ne fonctionne pas lorsque Set-Constant
est contenu dans un module. Elle créera une constante dans la portée du module, où Set-Constant
est contenu. Comme solution de contournement, on pourrait passer le paramètre -Surround Global
mais ce n'est pas toujours souhaité. Je voudrais créer une constante dans un autre module ou localement dans une fonction.
Pour utiliser un type de valeur spécifique, par exemple Int64, vous pouvez explicitement convertir la valeur utilisée dans set-variable.
Par exemple :
set-variable -name test -value ([int64]100) -option Constant
Pour vérifier,
$test | gm
Et vous verrez que c'est un Int64 (plutôt qu'un Int32, ce qui serait normal pour la valeur 100).
Cela pourrait être raccourci : set -o const test ([int64]100)
. C'est l'un des rares cas où je préfère l'alias au nom complet de la commande dans un script, pour laisser mon esprit "scanner" le code source plus rapidement.
J'aime vraiment le sucre syntaxique qui Réponse de Rob fournit :
const myConst = 42
Malheureusement, sa solution ne fonctionne pas comme prévu lorsque l'on définit l'attribut Set-Constant
dans un module . Lorsqu'il est appelé depuis l'extérieur du module, il crée une constante dans la portée du module, où Set-Constant
est définie, au lieu de la portée de l'appelant . Cela rend la constante invisible pour l'appelant.
La fonction modifiée suivante corrige ce problème. La solution est basée sur cette réponse à la question "Y a-t-il un moyen pour un module powershell d'accéder à la portée de son appelant ?" .
function Set-Constant {
<#
.SYNOPSIS
Creates constants.
.DESCRIPTION
This function can help you to create constants so easy as it possible.
It works as keyword 'const' as such as in C#.
.EXAMPLE
PS C:\> Set-Constant a = 10
PS C:\> $a += 13
There is a integer constant declaration, so the second line return
error.
.EXAMPLE
PS C:\> const str = "this is a constant string"
You also can use word 'const' for constant declaration. There is a
string constant named '$str' in this example.
.LINK
Set-Variable
About_Functions_Advanced_Parameters
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, Position=0)] [string] $Name,
[Parameter(Mandatory=$true, Position=1)] [char] [ValidateSet("=")] $Link,
[Parameter(Mandatory=$true, Position=2)] [object] $Value
)
$var = New-Object System.Management.Automation.PSVariable -ArgumentList @(
$Name, $Value, [System.Management.Automation.ScopedItemOptions]::Constant
)
$PSCmdlet.SessionState.PSVariable.Set( $var )
}
Set-Alias const Set-Constant
Notes :
Set-Variable -scope 1
devrait fonctionner), lorsque j'aurai trouvé comment le faire.-Mean
à -Value
par souci de cohérence avec Set-Variable
.Private
, ReadOnly
et AllScope
drapeaux. Il suffit d'ajouter les valeurs souhaitées au 3ème argument de la fonction PSVariable
Constructeur qui est appelé dans le script ci-dessus par l'intermédiaire de New-Object
.
Vous pouvez également modifier une variable existante avec set-variable (alias sv) ou en utilisant get-variable (gv) et en jouant avec sa propriété Options.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.