Respuestas:
Utilizar
Set-Variable test -option Constant -value 100
o
Set-Variable test -option ReadOnly -value 100
La diferencia entre "Constante" y "Solo lectura" es que una variable de solo lectura se puede eliminar (y luego volver a crear) mediante
Remove-Variable test -Force
mientras que una variable constante no se puede eliminar (incluso con -Force).
Consulte este artículo de TechNet para obtener más detalles.
Set-Variable test -option Constant -value [string]100
([string]100)
. Vea las respuestas a continuación.
Aquí hay una solución para definir una constante como esta:
const myConst = 42
Solución tomada 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á contenido en un módulo. Creará una constante en el alcance del módulo, donde Set-Constant
está contenido. Como solución alternativa, se podría pasar un parámetro -Surround Global
, pero eso no siempre se desea. Me gustaría crear una constante en otro módulo o localmente en una función.
Usar -option Constant
con el Set-Variable
cmdlet:
Set-Variable myvar -option Constant -value 100
Ahora $myvar
tiene un valor constante de 100 y no se puede modificar.
Set-Variable
? Cuando se trata de variables, se puede usar, [string]$name = value
pero eso parece no ser posible para las constantes.
set-variable -name test -value ([int64]100) -option Constant
Para usar un tipo de valor específico, digamos Int64, puede convertir explícitamente el valor usado en set-variable.
Por ejemplo:
set-variable -name test -value ([int64]100) -option Constant
Verificar,
$test | gm
Y verá que es un Int64 (en lugar de Int32, que sería normal para el valor 100).
Realmente me gusta el azúcar sintáctico que proporciona la respuesta de Rob:
const myConst = 42
Desafortunadamente, su solución no funciona como se esperaba cuando define la Set-Constant
función en un módulo . Cuando se llama desde fuera del módulo, creará una constante en el alcance del módulo, donde Set-Constant
se define, en lugar del alcance del llamador . Esto hace que la constante sea invisible para la persona que llama.
La siguiente función modificada soluciona este problema. La solución se basa en esta respuesta a la pregunta "¿Hay alguna forma de que un módulo de PowerShell llegue al alcance de su llamador?" .
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
debería funcionar), cuando descubra cómo hacerlo.-Mean
a -Value
, por coherencia con Set-Variable
.Private
, ReadOnly
y AllScope
. Simplemente agregue los valores deseados al tercer argumento del PSVariable
constructor , al que se llama en el script anterior New-Object
.PowerShell v5.0 debería permitir
[estática] [int] $ variable = 42
[estática] [DateTime] $ este día
y similares.
Set-Variable
? Cuando se trata de variables, se puede usar,[string]$name = value
pero eso parece no ser posible para las constantes.