PowerShell是否支持常量?


Answers:


121

Set-Variable test -option Constant -value 100

要么

Set-Variable test -option ReadOnly -value 100

“ Constant”和“ ReadOnly”之间的区别在于可以通过以下方式删除(然后重新创建)只读变量

Remove-Variable test -Force

而常量变量无法删除(即使使用-Force也是如此)。

请参阅此TechNet文章以了解更多详细信息。


4
嗯,但是在使用时如何强制数据类型Set-Variable?在处理变量时可能会用到,[string]$name = value但对于常量似乎似乎不可能?
masi 2012年

8
@masi只是强制使用此值Set-Variable test -option Constant -value [string]100
Monso 2014年

7
@Monso当指定类似的类型时,需要在值周围加上括号([string]100)。请参阅下面的答案。
Polymorphix

15

这是定义这样的常量的解决方案:

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

1
不幸的是,当Set-Constant包含在模块中时,这不起作用。它将在包含模块范围的模块范围内创建一个常量Set-Constant。作为一种解决方法,可以传递参数-Surround Global,但这并不总是需要的。我想在另一个模块中或在函数本地创建一个常量。
zett42

11

-option ConstantSet-Variablecmdlet 一起使用:

Set-Variable myvar -option Constant -value 100

现在$myvar的常量值为100,无法修改。


1
哇,笨拙。您必须使用Set-Variable做到这一点,对吧?
汤姆·黑兹

是的,没有坚定的方法:)
Paolo Tedesco 2010年

1
您还可以使用set-variable(别名为sv)或使用get-variable(gv)并对其Options属性进行修改来修改现有变量。
2010年

嗯,但是在使用时如何强制数据类型Set-Variable?在处理变量时可能会用到,[string]$name = value但对于常量似乎似乎不可能?
masi 2012年

@masi-在此页的其他位置查看Mike Shepard的答案。从那里复制并粘贴,它是:set-variable -name test -value ([int64]100) -option Constant
Chris J

11

要使用特定类型的值(例如Int64),可以显式转换set-variable中使用的值。

例如:

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

去检查,

$test | gm

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


5

我真的很喜欢rob的答案提供的语法糖:

const myConst = 42

不幸的是,当您Set-Constant模块中定义函数时,他的解决方案无法按预期工作。当从模块外部调用时,它将在模块范围(Set-Constant已定义)中创建一个常量,而不是调用者的scope。这使得常量对于调用者是不可见的。

以下修改的功能可解决此问题。该解决方案是基于这个答案的问题“有没有什么办法了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
  • 该功能可以扩展到任意设置PrivateReadOnlyAllScope标志。只需将所需的值添加到PSVariable构造函数的第3个参数中,即可在上述脚本中通过调用New-Object

-4

PowerShell v5.0应该允许

[静态] [int] $ variable = 42

[静态] [日期时间] $ thisday

等等。


2
不适用于ps 5.1。找不到类型[静态]。
ThomasMX '16

5
更不用说,静态与常数不相同
Kolob Canyon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.