programing

PowerShell은 상수를 지원합니까?

padding 2023. 4. 8. 08:02
반응형

PowerShell은 상수를 지원합니까?

PowerShell에 정수 상수를 선언합니다.

그것을 할 수 있는 좋은 방법이 있을까요?

사용하다

Set-Variable test -Option Constant -Value 100

또는

Set-Variable test -Option ReadOnly -Value 100

"Constant"와 "ReadOnly"의 차이점은 읽기 전용 변수를 삭제(그 후 다시 생성)할 수 있다는 것입니다.

Remove-Variable test -Force

반면 상수 변수는 제거할 수 없습니다(-Force 사용 시에도).

자세한 내용은 이 TechNet 기사를 참조하십시오.

다음은 상수를 정의하는 솔루션입니다.

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

사용하다-option Constant와 함께Set-Variablecmdlet:

Set-Variable myvar -option Constant -value 100

지금이다$myvar의 상수 값은 100이며 변경할 수 없습니다.

Int64와 같은 특정 유형의 값을 사용하려면 set-variable에서 사용되는 값을 명시적으로 캐스팅할 수 있습니다.

예:

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

체크하기 위해서

$test | gm

(Int32가 아닌) Int64임을 알 수 있습니다(값 100은 정상입니다).

롭의 답변이 주는 통사설탕은 정말 마음에 들어요.

const myConst = 42

유감스럽게도 그의 솔루션은 당신이 정의했을 때 예상대로 작동하지 않는다.Set-Constant모듈 내에서 기능합니다.모듈 외부에서 호출하면 모듈 스코프에 상수가 생성됩니다.Set-Constant는, 발신자의 범위가 아니고 정의됩니다.이것에 의해, 발신자에게는 상수가 표시되지 않게 됩니다.

다음 수정된 함수로 이 문제를 해결합니다.이 솔루션은 "powershell 모듈이 발신자의 범위에 도달할 수 있는 방법은 없습니까?"라는 질문에 대한 이 답변에 기초하고 있습니다.

$null = New-Module {
    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] $Name,
            [Parameter(Mandatory=$true, Position=1)] [char] [ValidateSet("=")] $Link,
            [Parameter(Mandatory=$true, Position=2)] [object] $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

주의:

  • New-Module다른 스코프 도메인(일명 세션스테이트)에서 호출된 경우만 이 함수가 기능하기 때문에 line이 존재합니다.실제 모듈 파일(.psm1)에 함수를 넣을 수는 있지만, 같은 모듈 내에서 사용할 수는 없습니다.인메모리 모듈을 사용하면 PowerShell 스크립트(.ps1)와 모듈 파일 모두에서 그대로 사용할 수 있습니다.
  • 파라미터의 이름을 변경했습니다.-Mean로.-Value, 와의 정합성을 위해Set-Variable.
  • 이 함수는 확장되어 옵션으로 설정될 수 있습니다.Private,ReadOnly그리고.AllScope원하는 값을 생성자의 세 번째 인수에 추가합니다. 이 인수는 위의 스크립트에서 호출됩니다.New-Object.

PowerShell v5.0에서는

[ static ] [int ]$140 = 42

[static] [Date Time]$ thisday

뭐 이런 거.

언급URL : https://stackoverflow.com/questions/2608215/does-powershell-support-constants

반응형