Мне действительно нравится синтаксический сахар, который ответ Роба дает:
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
. Просто добавьте нужные значения в 3-й аргумент конструктора PSVariable
, который вызывается в приведенном выше сценарии через New-Object
.