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