web-dev-qa-db-fra.com

PowerShell prend-il en charge les constantes?

Je voudrais déclarer quelques constantes entières dans PowerShell.

Y a-t-il un bon moyen de le faire?

101
Tom Hazel

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

tandis qu'une variable constante ne peut pas être supprimée (même avec -Force).

Voir cet article TechNet pour plus de détails.

103
Motti Strom

Voici une solution pour définir une constante comme celle-ci:

const myConst = 42

Solution tirée de http://poshcode.org/406

    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
13
rob

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

Vérifier,

$test | gm

Et vous verrez que c'est un Int64 (plutôt que Int32, ce qui serait normal pour la valeur 100).

10
Mike Shepard

Utilisation -option Constant avec le Set-Variable applet de commande:

Set-Variable myvar -option Constant -value 100

À présent $myvar a une valeur constante de 100 et ne peut pas être modifié.

9
Paolo Tedesco

J'aime vraiment le sucre syntaxique que réponse de rob fournit:

const myConst = 42

Malheureusement, sa solution ne fonctionne pas comme prévu lorsque vous définissez le Set-Constant fonction dans un module . Lorsqu'il est appelé de l'extérieur du module, il crée une constante dans la portée du module, où Set-Constant est défini, 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 "Existe-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] [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:

  • La fonction fonctionne uniquement , lorsqu'elle est appelée depuis à l'extérieur du module, où elle est défini. Ceci est le cas d'utilisation prévu, mais je voudrais ajouter une vérification, s'il est appelé à partir du même module (auquel cas Set-Variable -scope 1 devrait fonctionner), quand j'aurai trouvé comment le faire.
  • J'ai renommé le paramètre -Mean à -Value, pour cohérence avec Set-Variable.
  • La fonction peut être étendue pour définir éventuellement les indicateurs Private, ReadOnly et AllScope. Ajoutez simplement les valeurs souhaitées au 3e argument du constructeur PSVariable , qui est appelé dans le script ci-dessus via New-Object.
3
zett42