Чи підтримує 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). Відповіді дивіться нижче.
Поліморфікс

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-Variableкомандлетом:

Set-Variable myvar -option Constant -value 100

Тепер $myvarмає постійне значення 100 і його неможливо змінити.


1
Ого, це незграбно. Ви повинні використовувати Set-Variable для цього, так?
Том Хейзел

Так, немає неясного способу це зробити :)
Паоло Тедеско

1
Ви також можете змінити та існуючу змінну за допомогою змінної set (псевдонім sv) або за допомогою get-змінної (gv) та майстерності з її властивістю Options.
x0n

Хм, але як змусити тип даних при використанні Set-Variable? При роботі зі змінними можна використовувати, [string]$name = valueале це, здається, неможливо для констант?
masi

@masi - див. відповідь Майка Шепарда в інших місцях на цій сторінці. Скопіюйте та вставте звідти:set-variable -name test -value ([int64]100) -option Constant
Кріс Дж.

11

Щоб використовувати певний тип значення, скажімо, Int64, ви можете явно передати значення, яке використовується у змінній set.

Наприклад:

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

Перевіряти,

$test | gm

І ви побачите, що це Int64 (а не Int32, що було б нормальним для значення 100).


5

Мені дуже подобається синтаксичний цукор, який відповідає у відповіді :

const myConst = 42

На жаль, його рішення не працює так, як очікувалося, коли ви визначаєте Set-Constantфункцію в модулі . При виклику ззовні модуля він створить константу в області модуля, де Set-Constantвизначено, а не область виклику . Це робить постійну невидимою для абонента.

Наступна змінена функція усуває цю проблему. Рішення ґрунтується на цій відповіді на питання "Чи є спосіб, щоб модуль патронної оболонки потрапив до сфери дії свого абонента?" .

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] змінна $ = 42

[статичний] [DateTime] $ цього дня

тощо.


2
не працює на ps 5.1. Неможливо знайти тип [статичний].
ThomasMX

5
Не кажучи вже про статику - це не те саме, що константа
Колобський каньйон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.