создать типизированную переменную только для чтения в PowerShell - PullRequest
2 голосов
/ 09 марта 2020

Можно ли создать типизированную переменную / постоянную только для чтения в скрипте PowerShell? На самом деле существует два способа создания переменной:

Первый способ:

[int] $myVar1 Но я не знаю ни одного постоянного / доступного только для чтения ключевого слова, ни какого-либо другого способа предотвратить изменения этой переменной.

Секунда через командлет:

New-Variable -Name 'myVar1' -Option ReadOnly (редактируемый с -Force) или New-Variable -Name 'myVar1' -Option Constant

Но я не знаю, как применить оба. Есть идеи?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Чтобы собрать полезный ответ Адама Луневского и Полезная рекомендация Йероена Мостерта :

  • Вы не можете установить параметры переменных как часть присвоения переменной .

    • Пока вы можете применять атрибуты проверки к назначению, как показано в Ответ Адама, они не могут быть использованы для обеспечения поведения только для чтения.
  • Только New-Variable и Set-Variable позволяют указать переменные опции через их -Option параметр.

    • Опции ReadOnly и Constant отличаются только тем, можете ли вы позже удалить переменную снова:

      • ReadOnly переменная может быть может быть удалена с помощью Remove-Variable, если вы также передадите переключатель -Force.

      • a Constant переменная не может быть удалена после создания.


Поэтому, чтобы получить то, что вы хотите:

  • Используйте New-Variable (или Set-Variable) с -Option Constant, что предотвращает его дальнейшее удаление.

    • Обратите внимание, что ваша переменная может по умолчанию все еще будет затенен переменной с тем же именем, созданной в области видимости Потомок ; Например: Set-Variable -Option Constant var 1; & { $var = 2; $var } - внутри блока скрипта был создан новый локальный $var, который затенял внешний, постоянный.

    • Чтобы предотвратить это, используйте -Option Constant, AllScope, который гарантирует, что весь код в сеансе видит одно и то же значение для переменной с заданным именем, но учтите, что код, который пытается создать свою собственную копию, может затем потерпеть неудачу, поэтому вы должны делать это только с именами переменных, которые можно считать не используется для других целей в другом коде.

  • Чтобы присвоить специально набранное значение , передайте его -Value через выражение (заключено в (...), оператор группировки ) - при необходимости:

# Create a constant, [int]-typed variable.
# Note that just `-Value 42` would be sufficient here.
New-Variable -Option Constant -Name myVar1 -Value ([int] 42)

В этом случае будет достаточно -Value 42 потому что PowerShell по умолчанию анализирует аргументы без кавычек, которые могут быть проанализированы как числа как таковые, с [int] в качестве наименьшего выбранного типа; Вы даже можете использовать суффиксы числового типа, такие как L для [long]. Однако отрицательные"числовые строки" (например, -42) не распознаются как числа и требуют (...).

Аналогично, цитируется Маркер (например, '42') неявно создаст [string], литерал хеш-таблицы (@{ key = 'value' }) создаст хеш-таблицу и т. Д .; простая ссылка на переменную (например, $HOME) или доступ к члену (например, $HOME.ToUpper()) сохранит тип значения переменной / члена.

См. также:

  • Этот ответ предоставляет подробный обзор того, как анализируется токен без кавычек в режиме аргумента (режим разбора для команд, в которые передаются аргументы).

  • Этот ответ объясняет, как PowerShell анализирует числовые литералы (что также применяется при передаче без кавычек токенов в качестве аргументов команды).

1 голос
/ 09 марта 2020

Разве это не сработает?

New-Variable -Name x -Value ([double]5) -Option ReadOnly -Force
$x.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType

При желании вы также можете использовать атрибуты, чтобы сделать синтаксис короче:

[ValidateSet(2)][int]$y=2
[ValidateRange(3,3)][int]$z=3

Но это не выдаст ошибку, если вы попытаетесь присвоить то же значение снова, в то время как только для чтения / константа буду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...