PowerShell sabitleri destekliyor mu?


118

PowerShell'de bazı tamsayı sabitleri bildirmek istiyorum.

Bunu yapmanın iyi bir yolu var mı?

Yanıtlar:


121

kullanım

Set-Variable test -option Constant -value 100

veya

Set-Variable test -option ReadOnly -value 100

"Sabit" ve "Salt Okunur" arasındaki fark, salt okunur bir değişkenin şu yolla kaldırılabilmesidir (ve sonra yeniden oluşturulabilir)

Remove-Variable test -Force

oysa sabit bir değişken kaldırılamaz (-Force ile bile).

Daha fazla ayrıntı için bu TechNet makalesine bakın.


4
Hmm, ama kullanırken veri türünü nasıl zorlarsınızSet-Variable ? Değişkenlerle uğraşırken kullanılabilir, [string]$name = valueancak bu sabitler için mümkün görünmüyor mu?
masi

8
@masi sadece değeri zorlaSet-Variable test -option Constant -value [string]100
Monso

7
@Monso Gibi türü belirlerken değerin etrafında parantezlere ihtiyacınız var ([string]100). Aşağıdaki cevaplara bakın.
Polymorphix

15

İşte böyle bir sabiti tanımlamak için bir çözüm:

const myConst = 42

Http://poshcode.org/4063 adresinden alınan çözüm

    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

1
Maalesef bu, Set-Constantbir modülün içindeyken çalışmaz . Modül kapsamında bulunduğu yerde bir sabit oluşturacaktır Set-Constant. Geçici bir çözüm olarak parametre geçilebilir -Surround Global, ancak bu her zaman istenmez. Başka bir modülde veya bir fonksiyonda yerel olarak bir sabit oluşturmak istiyorum.
zett42

11

Cmdlet -option Constantile kullanın Set-Variable:

Set-Variable myvar -option Constant -value 100

Artık $myvar100 sabit değerine sahip ve değiştirilemez.


1
Vay canına, bu hantal. Bunu yapmak için Set-Variable kullanmak zorundasın, ha?
Tom Hazel

Evet, :) bunu yapmak için unclunky yolu yoktur
Paolo Tedesco

1
ayrıca set değişkeniyle (sv'ye diğer adla) veya get-değişkenini (gv) kullanarak ve Options özelliği ile değiştirerek değişkeni değiştirebilir ve mevcut değişkeni değiştirebilirsiniz.
x0n

Hmm, ama kullanırken veri türünü nasıl zorlarsınız Set-Variable? Değişkenlerle uğraşırken kullanılabilir, [string]$name = valueancak bu sabitler için mümkün görünmüyor mu?
masi

@masi - Mike Shepard'ın cevabına bu sayfada başka bir yerde bakın. Oradan kopyalayıp yapıştırmak:set-variable -name test -value ([int64]100) -option Constant
Chris J

11

Belirli bir değer türü kullanmak için, örneğin Int64, set değişkeninde kullanılan değeri açıkça çevirebilirsiniz.

Örneğin:

set-variable -name test -value ([int64]100) -option Constant

Kontrol etmek,

$test | gm

Ve bunun bir Int64 olduğunu göreceksiniz (100 değeri için normal olan Int32 yerine).


5

Soygunun cevabının sağladığı sözdizimsel şekeri gerçekten seviyorum :

const myConst = 42

Ne yazık ki, Set-Constantbir modülde işlevi tanımladığınızda çözümü beklendiği gibi çalışmıyor . Modül dışından çağrıldığında, modül kapsamında arayanın kapsamıSet-Constant yerine tanımlandığı yerde bir sabit oluşturacaktır. . Bu, sabit olanı arayan için görünmez hale getirir.

Aşağıdaki değiştirilmiş işlev, bu sorunu giderir. Çözüm, "Bir powershell modülünün arayanın kapsamına girmesinin herhangi bir yolu var mı?" Sorusuna verilen bu cevaba dayanmaktadır. .

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

Notlar:

  • İşlev yalnızca tanımlandığı modülün dışından çağrıldığında çalışır . Bu amaçlanan kullanım durumudur, ancak aynı modülden çağrılıp çağrılmadığına dair bir kontrol eklemek istiyorum (bu durumdaSet-Variable -scope 1 nasıl yapılacağını öğrendiğimde işe yaramalı).
  • İle tutarlı olması için parametreyi -Meanolarak yeniden adlandırdım .-ValueSet-Variable
  • Fonksiyon isteğe ayarlamak için uzun olabilir Private, ReadOnlyve AllScopebayrakları. Basitçe 3. argüman istenen değerleri ekleyin PSVariableyapıcı yoluyla yukarıdaki komut denir New-Object.

-4

PowerShell v5.0 izin vermelidir

[statik] [int] $ değişken = 42

[statik] [DateTime] $ bugün

ve benzerleri.


2
ps 5.1'de çalışmaz. [Statik] türü bulunamıyor.
ThomasMX

5
Statik, sabit ile aynı şey değildir
Kolob Canyon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.