Answers:
用
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
cmdlet 一起使用:
Set-Variable myvar -option Constant -value 100
现在$myvar
的常量值为100,无法修改。
Set-Variable
?在处理变量时可能会用到,[string]$name = value
但对于常量似乎似乎不可能?
set-variable -name test -value ([int64]100) -option Constant
我真的很喜欢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
。Private
,ReadOnly
和AllScope
标志。只需将所需的值添加到PSVariable
构造函数的第3个参数中,即可在上述脚本中通过调用New-Object
。PowerShell v5.0应该允许
[静态] [int] $ variable = 42
[静态] [日期时间] $ thisday
等等。
Set-Variable
?在处理变量时可能会用到,[string]$name = value
但对于常量似乎似乎不可能?