Поддерживает ли PowerShell константы?

Я хотел бы объявить некоторые целочисленные константы в PowerShell.

Есть ли хороший способ сделать это?

Ответ 1

Использование

Set-Variable test -option Constant -value 100

или

Set-Variable test -option ReadOnly -value 100

Разница между "константой" и "ReadOnly" заключается в том, что переменная только для чтения может быть удалена (а затем воссоздана) с помощью

Remove-Variable test -Force

тогда как постоянная переменная не может быть удалена (даже с -Force).

Подробнее см. эту статью TechNet.

Ответ 2

Вот решение для определения такой константы:

const myConst = 42

Решение взято из 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

Ответ 3

Чтобы использовать определенный тип значения, например Int64, вы можете явно использовать значение, используемое в переменной set.

Например:

set-variable -name test -value ([int64]100) -option Constant

Чтобы проверить,

$test | gm

И вы увидите, что это Int64 (а не Int32, который был бы нормальным для значения 100).

Ответ 4

Используйте -option Constant с помощью командлета Set-Variable:

Set-Variable myvar -option Constant -value 100

Теперь $myvar имеет постоянное значение 100 и не может быть изменено.

Ответ 5

Мне очень нравится синтаксический сахар, который отнимает ответ :

const myConst = 42

К сожалению, его решение не работает должным образом, когда вы определяете функцию Set-Constant в модуле module. При вызове извне модуля он создает константу в области видимости модуля, где определен Set-Constant вместо области вызова. Это делает константу невидимой для вызывающего.

Следующая модифицированная функция решает эту проблему. Решение основано на этом ответе на вопрос "Есть ли способ для модуля powershell получить доступ к своей области вызова?".

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

Примечание:

  • Функция только работает, когда вызывается из снаружи модуля, где она определена. Это предполагаемый вариант использования, но я хотел бы добавить проверку, вызывается ли он из того же модуля (в этом случае Set-Variable -scope 1 должен работать), когда я узнаю, как это сделать.
  • Я переименовал параметр -Mean в -Value для согласованности с Set-Variable.
  • Функцию можно расширить, чтобы дополнительно установить флаги Private, ReadOnly и AllScope. Просто добавьте нужные значения в 3-й аргумент конструктора PSVariable, который вызывается в приведенном выше сценарии через New-Object.

Ответ 6

PowerShell v5.0 должен разрешить

[статические] [int] $variable = 42

[статические] [DateTime] $thisday

и т.п.