PowerShell은 상수를 지원합니까?


118

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포함 된 모듈 범위에 상수를 생성합니다 . 해결 방법으로 parameter를 전달할 수 -Surround Global있지만 항상 원하는 것은 아닙니다. 다른 모듈이나 함수에서 로컬로 상수를 만들고 싶습니다.
zett42

11

cmdlet -option Constant과 함께 사용 Set-Variable:

Set-Variable myvar -option Constant -value 100

이제 $myvar상수 값이 100이고 수정할 수 없습니다.


1
와우, 투박하네요. 이를 위해서는 Set-Variable을 사용해야합니다.
Tom Hazel

예, 그렇게하는 깔끔한 방법은 없습니다. :)
Paolo Tedesco

1
또한 set-variable (sv로 별칭 지정)을 사용하거나 get-variable (gv)을 사용하고 Options 속성을 사용하여 수정하여 기존 변수를 수정할 수도 있습니다.
x0n

흠,하지만 사용할 때 데이터 유형을 어떻게 강제 Set-Variable합니까? 변수를 다룰 때 사용할 수 [string]$name = value있지만 상수에는 불가능한 것 같습니다.
masi

@masi-이 페이지의 다른 곳에서 Mike Shepard의 답변을 참조하십시오. 거기에서 복사하여 붙여 넣으십시오.set-variable -name test -value ([int64]100) -option Constant
Chris J

11

특정 유형의 값 (예 : Int64)을 사용하려면 set-variable에 사용 된 값을 명시 적으로 캐스팅 할 수 있습니다.

예를 들면 :

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

확인하다,

$test | gm

그리고 그것은 Int64 (값 100에 대해 정상인 Int32가 아니라)임을 알 수 있습니다.


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, ReadOnlyAllScope플래그 를 선택적으로 설정하도록 함수를 확장 할 수 있습니다 . 위의 스크립트에서 호출되는 PSVariable생성자 의 세 번째 인수에 원하는 값을 추가하기 만하면 됩니다 New-Object.

-4

PowerShell v5.0은

[정적] [int] $ variable = 42

[정적] [DateTime] $ 오늘

등.


2
ps 5.1에서는 작동하지 않습니다. [정적] 유형을 찾을 수 없습니다.
ThomasMX

5
언급하지 않기에, 정적 상수와 동일하지 않습니다
계산법 캐년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.