Odpowiedzi:
Posługiwać się
Set-Variable test -option Constant -value 100
lub
Set-Variable test -option ReadOnly -value 100
Różnica między „Constant” i „ReadOnly” polega na tym, że zmienną tylko do odczytu można usunąć (a następnie ponownie utworzyć) za pomocą
Remove-Variable test -Force
podczas gdy stałej zmiennej nie można usunąć (nawet z -Force).
Zobacz ten artykuł TechNet, aby uzyskać więcej informacji.
Set-Variable test -option Constant -value [string]100
([string]100)
. Zobacz odpowiedzi poniżej.
Oto rozwiązanie umożliwiające zdefiniowanie stałej w następujący sposób:
const myConst = 42
Rozwiązanie pobrane z 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
jest zawarty w module. Utworzy stałą w zakresie modułu, w którym Set-Constant
jest zawarta. Aby obejść ten problem, można przekazać parametr -Surround Global
, ale nie zawsze jest to pożądane. Chciałbym utworzyć stałą w innym module lub lokalnie w funkcji.
Użyj -option Constant
z Set-Variable
cmdletem:
Set-Variable myvar -option Constant -value 100
Teraz $myvar
ma stałą wartość 100 i nie można jej modyfikować.
Set-Variable
? Kiedy mamy do czynienia ze zmiennymi, można użyć, [string]$name = value
ale wydaje się, że nie jest to możliwe w przypadku stałych?
set-variable -name test -value ([int64]100) -option Constant
Aby użyć określonego typu wartości, na przykład Int64, możesz jawnie rzutować wartość używaną w ustawionej-zmiennej.
Na przykład:
set-variable -name test -value ([int64]100) -option Constant
Sprawdzić,
$test | gm
Zobaczysz, że jest to Int64 (zamiast Int32, co byłoby normalne dla wartości 100).
Bardzo podoba mi się cukier składniowy, który zapewnia odpowiedź Roba:
const myConst = 42
Niestety jego rozwiązanie nie działa zgodnie z oczekiwaniami, gdy definiujesz Set-Constant
funkcję w module . W przypadku wywołania spoza modułu, utworzy stałą w zakresie modułu, gdzie Set-Constant
jest zdefiniowana, zamiast zakresu wywołującego . To sprawia, że stała jest niewidoczna dla dzwoniącego.
Następująca zmodyfikowana funkcja rozwiązuje ten problem. Rozwiązanie opiera się na tej odpowiedzi na pytanie „Czy istnieje sposób, aby moduł PowerShell znalazł się w zasięgu osoby dzwoniącej?” .
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
Uwagi:
Set-Variable -scope 1
powinien działać), gdy dowiem się, jak to zrobić.-Mean
na -Value
, aby zachować spójność z Set-Variable
.Private
, ReadOnly
i AllScope
niepokój. Po prostu dodaj żądane wartości do trzeciego argumentu PSVariable
konstruktora , który jest wywoływany w powyższym skrypcie through New-Object
.Program PowerShell w wersji 5.0 powinien umożliwiać
[statyczny] [int] $ zmienna = 42
[statyczny] [DateTime] $ thisday
i tym podobne.
Set-Variable
? Kiedy mamy do czynienia ze zmiennymi, można użyć,[string]$name = value
ale wydaje się, że nie jest to możliwe w przypadku stałych?