PowerShell 支持常量吗?

我想在 PowerShell 中声明一些整数常量。

有什么好办法吗?

82240 次浏览

Set-Variable cmdlet 中使用 -option Constant:

Set-Variable myvar -option Constant -value 100

现在 $myvar的常数值为100,不能修改。

使用

Set-Variable test -Option Constant -Value 100

或者

Set-Variable test -Option ReadOnly -Value 100

“ Constant”和“ 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-variable 中使用的值。

例如:

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

为了检查,

$test | gm

您将看到它是一个 Int64(而不是 Int32,这对值100来说是正常的)。

PowerShell v5.0应该允许

[ static ][ int ] $variable = 42

今天

诸如此类。

我真的很喜欢 Rob 的回答提供的语法糖:

const myConst = 42

不幸的是,当您在 模组中定义 Set-Constant函数时,他的解决方案并不能像预期的那样工作。当从模块外部调用时,它将在定义 Set-Constant的模块作用域中创建一个常量,而不是在定义 呼叫器显示范围的模块作用域中创建一个常量。这使得常量对于调用者是不可见的。

下面修改的函数解决了这个问题。解决方案是基于 这个答案的问题 “ Powershell 模块有没有办法进入其调用者的作用域?”

$null = New-Module {
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] $Name,
[Parameter(Mandatory=$true, Position=1)] [char] [ValidateSet("=")] $Link,
[Parameter(Mandatory=$true, Position=2)] [object] $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

备注:

  • New-Module行之所以存在,是因为函数 只有在从不同的 作用域作用域范围域(又名 会话状态)调用时能够工作。您可以将函数放入一个实际的模块文件(。Psm1) ,但是您不能在同一个模块中使用它!内存中模块使它可以在 PowerShell 脚本(。Ps1)以及模块文件。
  • 为了与 Set-Variable保持一致,我将参数 -Mean重命名为 -Value
  • 该函数可以扩展为可选地设置 PrivateReadOnlyAllScope标志。只需将所需的值添加到 PSVariable构造函数的第3个参数中,该参数在上面的脚本中通过 New-Object调用。