Відповіді:
Використовуйте
Set-Variable test -option Constant -value 100
або
Set-Variable test -option ReadOnly -value 100
Різниця між "Constant" і "ReadOnly" полягає в тому, що змінну, доступну лише для читання, можна видалити (а потім знову створити) за допомогою
Remove-Variable test -Force
тоді як постійну змінну неможливо видалити (навіть із -Force).
Дивіться цю статтю TechNet для отримання більш детальної інформації.
Set-Variable test -option Constant -value [string]100
([string]100)
. Відповіді дивіться нижче.
Ось рішення для визначення такої константи:
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
Set-Constant
міститься в модулі. Це створить константу в області модуля, де Set-Constant
вона міститься. Як обхідний спосіб можна передати параметр -Surround Global
, але цього не завжди хочеться. Я хотів би створити константу в іншому модулі або локально у функції.
Використовувати -option Constant
з Set-Variable
командлетом:
Set-Variable myvar -option Constant -value 100
Тепер $myvar
має постійне значення 100 і його неможливо змінити.
Set-Variable
? При роботі зі змінними можна використовувати, [string]$name = value
але це, здається, неможливо для констант?
set-variable -name test -value ([int64]100) -option Constant
Щоб використовувати певний тип значення, скажімо, Int64, ви можете явно передати значення, яке використовується у змінній set.
Наприклад:
set-variable -name test -value ([int64]100) -option Constant
Перевіряти,
$test | gm
І ви побачите, що це Int64 (а не Int32, що було б нормальним для значення 100).
Мені дуже подобається синтаксичний цукор, який відповідає у відповіді :
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
.PowerShell v5.0 повинен дозволяти
[статична] [int] змінна $ = 42
[статичний] [DateTime] $ цього дня
тощо.
Set-Variable
? При роботі зі змінними можна використовувати,[string]$name = value
але це, здається, неможливо для констант?