Я хотел бы объявить некоторые целочисленные константы в PowerShell.
Есть ли хороший способ сделать это?
Я хотел бы объявить некоторые целочисленные константы в PowerShell.
Есть ли хороший способ сделать это?
Использование
Set-Variable test -option Constant -value 100
или
Set-Variable test -option ReadOnly -value 100
Разница между "константой" и "ReadOnly" заключается в том, что переменная только для чтения может быть удалена (а затем воссоздана) с помощью
Remove-Variable test -Force
тогда как постоянная переменная не может быть удалена (даже с -Force).
Подробнее см. эту статью TechNet.
Вот решение для определения такой константы:
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
		Чтобы использовать определенный тип значения, например Int64, вы можете явно использовать значение, используемое в переменной set.
Например:
set-variable -name test -value ([int64]100) -option Constant
Чтобы проверить,
$test | gm
И вы увидите, что это Int64 (а не Int32, который был бы нормальным для значения 100).
Используйте -option Constant с помощью командлета Set-Variable:
Set-Variable myvar -option Constant -value 100
Теперь $myvar имеет постоянное значение 100 и не может быть изменено.
Мне очень нравится синтаксический сахар, который отнимает ответ :
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.PowerShell v5.0 должен разрешить
[статические] [int] $variable = 42
[статические] [DateTime] $thisday
и т.п.