Respostas:
Usar
Set-Variable test -option Constant -value 100
ou
Set-Variable test -option ReadOnly -value 100
A diferença entre "Constant" e "ReadOnly" é que uma variável somente leitura pode ser removida (e depois recriada) por meio de
Remove-Variable test -Force
enquanto uma variável constante não pode ser removida (mesmo com -Force).
Consulte este artigo da TechNet para obter mais detalhes.
Set-Variable test -option Constant -value [string]100
([string]100)
. Veja as respostas abaixo.
Aqui está uma solução para definir uma constante como esta:
const myConst = 42
Solução retirada de 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
está contido em um módulo. Ele criará uma constante no escopo do módulo, onde Set-Constant
está contido. Como alternativa, pode-se passar um parâmetro -Surround Global
, mas isso nem sempre é desejado. Gostaria de criar uma constante em outro módulo ou localmente em uma função.
Use -option Constant
com o Set-Variable
cmdlet:
Set-Variable myvar -option Constant -value 100
Agora $myvar
tem um valor constante de 100 e não pode ser modificado.
Set-Variable
? Ao lidar com variáveis, pode-se usar, [string]$name = value
mas isso parece não ser possível para constantes?
set-variable -name test -value ([int64]100) -option Constant
Para usar um tipo específico de valor, digamos Int64, você pode converter explicitamente o valor usado em set-variable.
Por exemplo:
set-variable -name test -value ([int64]100) -option Constant
Checar,
$test | gm
E você verá que é um Int64 (em vez de Int32, o que seria normal para o valor 100).
Eu realmente gosto do açúcar sintático que a resposta de rob fornece:
const myConst = 42
Infelizmente, sua solução não funciona conforme o esperado quando você define a Set-Constant
função em um módulo . Quando chamado de fora do módulo, ele criará uma constante no escopo do módulo, onde Set-Constant
é definido, em vez do escopo do chamador . Isso torna a constante invisível para o chamador.
A função modificada a seguir corrige esse problema. A solução é baseada nesta resposta à pergunta "Existe alguma maneira de um módulo PowerShell chegar ao escopo de seu chamador?" .
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
Notas:
Set-Variable -scope 1
deve funcionar), quando eu descobrir como fazer isso.-Mean
para -Value
, para consistência com Set-Variable
.Private
, ReadOnly
e AllScope
. Basta adicionar os valores desejados ao terceiro argumento do PSVariable
construtor , que é chamado no script acima New-Object
.PowerShell v5.0 deve permitir
[estático] [int] $ variável = 42
[estático] [DateTime] $ thisday
e similar.
Set-Variable
? Ao lidar com variáveis, pode-se usar,[string]$name = value
mas isso parece não ser possível para constantes?