Jawaban:
Menggunakan
Set-Variable test -option Constant -value 100
atau
Set-Variable test -option ReadOnly -value 100
Perbedaan antara "Constant" dan "ReadOnly" adalah variabel hanya-baca dapat dihapus (dan kemudian dibuat kembali) melalui
Remove-Variable test -Force
sedangkan variabel konstan tidak dapat dihapus (bahkan dengan -Force).
Lihat artikel TechNet ini untuk lebih jelasnya.
Set-Variable test -option Constant -value [string]100
([string]100)
. Lihat jawaban di bawah.
Berikut adalah solusi untuk mendefinisikan konstanta seperti ini:
const myConst = 42
Solusi diambil dari 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
ada di dalam modul. Ini akan membuat konstanta dalam ruang lingkup modul, di mana Set-Constant
terkandung. Sebagai solusinya, seseorang dapat mengirimkan parameter -Surround Global
, tetapi itu tidak selalu diinginkan. Saya ingin membuat konstanta di modul lain atau secara lokal dalam suatu fungsi.
Gunakan -option Constant
dengan Set-Variable
cmdlet:
Set-Variable myvar -option Constant -value 100
Sekarang $myvar
memiliki nilai konstan 100 dan tidak dapat dimodifikasi.
Set-Variable
? Ketika berurusan dengan variabel, seseorang dapat menggunakan [string]$name = value
tetapi tampaknya tidak mungkin untuk konstanta?
set-variable -name test -value ([int64]100) -option Constant
Untuk menggunakan jenis nilai tertentu, katakanlah Int64, Anda dapat secara eksplisit mentransmisikan nilai yang digunakan dalam variabel set.
Misalnya:
set-variable -name test -value ([int64]100) -option Constant
Untuk memeriksa,
$test | gm
Dan Anda akan melihat bahwa itu adalah Int64 (bukan Int32, yang akan menjadi normal untuk nilai 100).
Saya sangat suka gula sintaksis yang diberikan oleh jawaban rob :
const myConst = 42
Sayangnya solusinya tidak berfungsi seperti yang diharapkan saat Anda mendefinisikan Set-Constant
fungsi dalam modul . Ketika dipanggil dari luar modul, itu akan membuat konstanta dalam lingkup modul, di mana Set-Constant
ditentukan, bukan lingkup pemanggil . Ini membuat konstanta tidak terlihat oleh pemanggil.
Fungsi modifikasi berikut memperbaiki masalah ini. Solusinya didasarkan pada jawaban atas pertanyaan "Apakah ada cara bagi modul PowerShell untuk menjangkau cakupan pemanggilnya?" .
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
Catatan:
Set-Variable -scope 1
seharusnya berfungsi), ketika saya telah menemukan cara melakukannya.-Mean
menjadi -Value
, untuk konsistensi dengan Set-Variable
.Private
, ReadOnly
dan secara opsional AllScope
. Cukup tambahkan nilai yang diinginkan ke argumen ke-3 dari PSVariable
konstruktor , yang dipanggil dalam skrip di atas melalui New-Object
.PowerShell v5.0 seharusnya mengizinkan
[statis] [int] $ variabel = 42
[Statis] [DateTime] $ thisday
dan sejenisnya.
Set-Variable
? Ketika berurusan dengan variabel, seseorang dapat menggunakan[string]$name = value
tetapi tampaknya tidak mungkin untuk konstanta?