PowerShell có hỗ trợ các hằng không?


118

Tôi muốn khai báo một số hằng số nguyên trong PowerShell.

Có cách nào tốt để làm điều đó?

Câu trả lời:


121

Sử dụng

Set-Variable test -option Constant -value 100

hoặc là

Set-Variable test -option ReadOnly -value 100

Sự khác biệt giữa "Constant" và "ReadOnly" là một biến chỉ đọc có thể được loại bỏ (và sau đó được tạo lại) thông qua

Remove-Variable test -Force

trong khi đó một biến không đổi không thể được loại bỏ (ngay cả với -Force).

Xem bài viết này của TechNet để biết thêm chi tiết.


4
Hmm, nhưng làm thế nào để bạn buộc kiểu dữ liệu khi sử dụng Set-Variable? Khi xử lý các biến người ta có thể sử dụng [string]$name = valuenhưng dường như điều đó là không thể đối với các hằng số?
Masi

8
@masi chỉ buộc giá trịSet-Variable test -option Constant -value [string]100
Monso

7
@Monso Bạn cần dấu ngoặc đơn xung quanh giá trị khi chỉ định loại như ([string]100). Xem câu trả lời dưới đây.
Polymorphix

15

Đây là một giải pháp để xác định một hằng số như thế này:

const myConst = 42

Giải pháp được lấy từ http://posehcode.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
Thật không may, điều này không hoạt động khi Set-Constantđược chứa trong một mô-đun. Nó sẽ tạo ra một hằng số trong phạm vi mô-đun, nơi Set-Constantchứa. Như một cách giải quyết, người ta có thể vượt qua tham số -Surround Global, nhưng điều đó không phải lúc nào cũng muốn. Tôi muốn tạo một hằng trong một mô-đun khác hoặc cục bộ trong một hàm.
zett42

11

Sử dụng -option Constantvới Set-Variablelệnh ghép ngắn:

Set-Variable myvar -option Constant -value 100

Bây giờ $myvarcó giá trị không đổi là 100 và không thể sửa đổi.


1
Wow, thật là rắc rối. Bạn phải sử dụng Set-Var biến để làm điều đó hả?
Tom Hazel

Vâng, không có cách nào rõ ràng để làm điều đó :)
Paolo Tedesco

1
bạn cũng có thể sửa đổi và biến hiện có với biến set (được đặt bí danh là sv) hoặc bằng cách sử dụng biến get (biến gv) và sửa lại thuộc tính Tùy chọn của nó.
x0n

Hmm, nhưng làm thế nào để bạn buộc kiểu dữ liệu khi sử dụng Set-Variable? Khi xử lý các biến người ta có thể sử dụng [string]$name = valuenhưng dường như điều đó là không thể đối với các hằng số?
Masi

@masi - xem câu trả lời của Mike Shepard ở nơi khác trong trang này. Sao chép và dán từ đó, đó là:set-variable -name test -value ([int64]100) -option Constant
Chris J

11

Để sử dụng một loại giá trị cụ thể, giả sử Int64, bạn có thể truyền rõ ràng giá trị được sử dụng trong biến set.

Ví dụ:

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

Để kiểm tra,

$test | gm

Và bạn sẽ thấy rằng đó là một Int64 (chứ không phải Int32, sẽ là bình thường đối với giá trị 100).


5

Tôi thực sự thích đường cú pháp mà câu trả lời của rob cung cấp:

const myConst = 42

Thật không may, giải pháp của anh ta không hoạt động như mong đợi khi bạn xác định Set-Constantchức năng trong một mô-đun . Khi được gọi từ bên ngoài mô-đun, nó sẽ tạo ra một hằng số trong phạm vi mô-đun, nơi Set-Constantđược xác định, thay vì phạm vi của người gọi . Điều này làm cho hằng số vô hình cho người gọi.

Các chức năng sửa đổi sau đây khắc phục vấn đề này. Giải pháp dựa trên câu trả lời này cho câu hỏi "Có cách nào để mô-đun powershell có được trong phạm vi của người gọi không?" .

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

Ghi chú:

  • Hàm chỉ hoạt động, khi được gọi từ bên ngoài mô-đun, nơi nó được xác định. Đây là trường hợp sử dụng dự định, nhưng tôi muốn thêm một kiểm tra, liệu nó có được gọi từ cùng một mô-đun không (trong trường hợp nào Set-Variable -scope 1sẽ hoạt động), khi tôi đã tìm ra cách thực hiện.
  • Tôi đã đổi tên tham số -Meanthành -Value, để thống nhất với Set-Variable.
  • Chức năng có thể được mở rộng để tùy chọn thiết lập Private, ReadOnlyAllScopecờ. Chỉ cần thêm các giá trị mong muốn vào đối số thứ 3 của hàm PSVariabletạo , được gọi trong tập lệnh trên thông qua New-Object.

-4

PowerShell v5.0 nên cho phép

[tĩnh] [int] $ biến = 42

[tĩnh] [DateTime] $ ngày nay

và như thế.


2
không hoạt động trên ps 5.1. Không thể tìm thấy loại [tĩnh].
ThomasMX

5
Chưa kể, tĩnh không giống như một hằng số
Kolob Canyon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.