PowerShell รองรับค่าคงที่หรือไม่


คำตอบ:


121

ใช้

Set-Variable test -option Constant -value 100

หรือ

Set-Variable test -option ReadOnly -value 100

ความแตกต่างระหว่าง "Constant" และ "ReadOnly" คือสามารถลบตัวแปรแบบอ่านอย่างเดียว (แล้วสร้างขึ้นใหม่) ผ่าน

Remove-Variable test -Force

ในขณะที่ตัวแปรคงที่ไม่สามารถลบออกได้ (แม้จะมี -Force)

ดูบทความ TechNetสำหรับรายละเอียดเพิ่มเติม


4
อืม แต่คุณบังคับประเภทข้อมูลSet-Variableอย่างไรเมื่อใช้? เมื่อจัดการกับตัวแปรอาจใช้[string]$name = valueแต่ดูเหมือนว่าจะไม่เป็นไปได้สำหรับค่าคงที่?
masi

8
@masi แค่บังคับค่าSet-Variable test -option Constant -value [string]100
Monso

7
@Monso ([string]100)คุณต้องวงเล็บรอบค่าเมื่อระบุประเภทเช่น ดูคำตอบด้านล่าง
Polymorphix

15

นี่คือวิธีแก้ปัญหาสำหรับการกำหนดค่าคงที่ดังนี้:

const myConst = 42

โซลูชันนำมาจาก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

1
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้เมื่อSet-Constantมีอยู่ในโมดูล มันจะสร้างค่าคงที่ในขอบเขตโมดูลที่Set-Constantมีอยู่ ในฐานะที่เป็นวิธีแก้ปัญหาเราสามารถส่งผ่านพารามิเตอร์-Surround Globalได้ แต่ก็ไม่ต้องการเสมอไป ฉันต้องการสร้างค่าคงที่ในโมดูลอื่นหรือในฟังก์ชัน
zett42

11

ใช้-option ConstantกับSet-Variablecmdlet:

Set-Variable myvar -option Constant -value 100

ตอนนี้$myvarมีค่าคงที่ 100 และไม่สามารถแก้ไขได้


1
ว้าวเป็นบ้า คุณต้องใช้ Set-Variable จึงจะทำได้ใช่ไหม?
Tom Hazel

ใช่ไม่มีวิธีที่ไม่เป็นระเบียบในการทำ :)
Paolo Tedesco

1
คุณยังสามารถแก้ไขและตัวแปรที่มีอยู่ด้วย set-variable (นามแฝงเป็น sv) หรือโดยใช้ get-variable (gv) และแก้ไขด้วยคุณสมบัติ Options
x0 น

อืม แต่คุณบังคับประเภทข้อมูลSet-Variableอย่างไรเมื่อใช้? เมื่อจัดการกับตัวแปรอาจใช้[string]$name = valueแต่ดูเหมือนว่าจะไม่เป็นไปได้สำหรับค่าคงที่?
masi

@masi - ดูคำตอบของ Mike Shepard ที่อื่นในหน้านี้ คัดลอกและวางจากที่นั่นคือ:set-variable -name test -value ([int64]100) -option Constant
Chris J

11

หากต้องการใช้ค่าประเภทใดประเภทหนึ่งให้พูดว่า Int64 คุณสามารถแคสต์ค่าที่ใช้ในตัวแปรชุดได้อย่างชัดเจน

ตัวอย่างเช่น:

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

เพื่อตรวจสอบ,

$test | gm

และคุณจะเห็นว่าเป็น Int64 (แทนที่จะเป็น Int32 ซึ่งจะเป็นปกติสำหรับค่า 100)


5

ฉันชอบน้ำตาลวากยสัมพันธ์ที่คำตอบของ robให้:

const myConst = 42

แต่น่าเสียดายที่การแก้ปัญหาของเขาไม่ได้ทำงานตามที่คาดไว้เมื่อคุณกำหนดSet-Constantฟังก์ชั่นในโมดูล เมื่อเรียกจากนอกโมดูลก็จะสร้างอย่างต่อเนื่องในขอบเขตโมดูลที่Set-Constantถูกกำหนดให้แทนของขอบเขตของผู้โทร สิ่งนี้ทำให้ผู้โทรมองไม่เห็นค่าคงที่

ฟังก์ชันที่แก้ไขต่อไปนี้ช่วยแก้ไขปัญหานี้ วิธีแก้ปัญหานี้ขึ้นอยู่กับคำตอบสำหรับคำถาม"มีวิธีใดบ้างที่โมดูล powershell จะไปถึงขอบเขตของผู้โทร" .

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

หมายเหตุ:

  • ฟังก์ชันนี้ใช้งานได้เฉพาะเมื่อถูกเรียกจากภายนอกโมดูลที่กำหนดไว้ นี่เป็นกรณีการใช้งานที่ตั้งใจไว้ แต่ฉันต้องการเพิ่มการตรวจสอบไม่ว่าจะถูกเรียกจากโมดูลเดียวกัน (ในกรณีนี้Set-Variable -scope 1ควรใช้งานได้) เมื่อฉันพบวิธีการแล้ว
  • ฉันได้เปลี่ยนชื่อพารามิเตอร์เป็น-Meanเพื่อ-Valueให้สอดคล้องกับSet-Variable.
  • ฟังก์ชั่นอาจจะขยายการตั้งค่าตัวเลือกPrivate, ReadOnlyและAllScopeธง เพียงแค่เพิ่มค่าที่ต้องการอาร์กิวเมนต์ที่ 3 ของPSVariableคอนสตรัคNew-Objectซึ่งเรียกว่าในสคริปต์ข้างต้นผ่าน

-4

PowerShell v5.0 ควรอนุญาต

[คงที่] [int] $ variable = 42

[คงที่] [DateTime] $ thisday

และชอบ


2
ไม่ทำงานบน ps 5.1 ไม่พบประเภท [คงที่]
ThomasMX

5
ไม่ต้องพูดถึงคงไม่เหมือนกับค่าคงที่
Kolob Canyon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.