Я хотел бы объявить некоторые целочисленные константы в 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
и т.п.