Réponses:
Utilisation
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 (puis recréée) via
Remove-Variable test -Force
alors qu'une variable constante ne peut pas être supprimée (même avec -Force).
Consultez cet article TechNet pour plus de détails.
Set-Variable test -option Constant -value [string]100
([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
Set-Constant
est contenu dans un module. Cela créera une constante dans la portée du module, où Set-Constant
est contenue. Comme solution de contournement, on peut passer un paramètre -Surround Global
, mais ce n'est pas toujours souhaité. Je souhaite créer une constante dans un autre module ou localement dans une fonction.
Utiliser -option Constant
avec l' Set-Variable
applet de commande:
Set-Variable myvar -option Constant -value 100
A maintenant $myvar
une valeur constante de 100 et ne peut pas être modifiée.
Set-Variable
? Quand on traite des variables, on peut utiliser [string]$name = value
mais cela ne semble pas possible pour les constantes?
set-variable -name test -value ([int64]100) -option Constant
Pour utiliser un type spécifique de valeur, par exemple Int64, vous pouvez convertir explicitement la valeur utilisée dans set-variable.
Par exemple:
set-variable -name test -value ([int64]100) -option Constant
Vérifier,
$test | gm
Et vous verrez qu'il s'agit d'un Int64 (plutôt que d'un Int32, ce qui serait normal pour la valeur 100).
J'aime vraiment le sucre syntaxique fourni par la réponse de rob :
const myConst = 42
Malheureusement, sa solution ne fonctionne pas comme prévu lorsque vous définissez la Set-Constant
fonction 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 résout 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'atteindre 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] [ValidateNotNullOrEmpty()] $Name,
[Parameter(Mandatory=$true, Position=1)] [char] [ValidateSet("=")] $Link,
[Parameter(Mandatory=$true, Position=2)] [object] [ValidateNotNullOrEmpty()] $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
Remarques:
Set-Variable -scope 1
devrait fonctionner), lorsque j'ai trouvé comment faire.-Mean
en -Value
, par souci de cohérence avec Set-Variable
.Private
, ReadOnly
et AllScope
. Ajoutez simplement les valeurs souhaitées au 3ème argument du PSVariable
constructeur , qui est appelé dans le script ci-dessus via New-Object
.PowerShell v5.0 devrait permettre
[statique] [int] $ variable = 42
[statique] [DateTime] $ thisday
etc.
Set-Variable
? Quand on traite des variables, on peut utiliser[string]$name = value
mais cela ne semble pas possible pour les constantes?