web-dev-qa-db-ja.com

PowerShellは定数をサポートしていますか?

PowerShellでいくつかの整数定数を宣言したいと思います。

それを行う良い方法はありますか?

101
Tom Hazel

つかいます

Set-Variable test -option Constant -value 100

または

Set-Variable test -option ReadOnly -value 100

「定数」と「読み取り専用」の違いは、読み取り専用変数を削除(および再作成)できることです。

Remove-Variable test -Force

一方、定数変数は削除できません(-Forceを使用しても)。

詳細については、 このTechNetの記事 を参照してください。

103
Motti Strom

このような定数を定義するためのソリューションは次のとおりです。

const myConst = 42

http://poshcode.org/406 から取られた解決策

    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
13
rob

Int64などの特定のタイプの値を使用するには、set-variableで使用される値を明示的にキャストできます。

例えば:

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

チェックする、

$test | gm

そして、それはInt64であることがわかります(Int32ではなく、値100で正常です)。

10
Mike Shepard

つかいます -option Constant とともに Set-Variableコマンドレット:

Set-Variable myvar -option Constant -value 100

$myvarの定数値は100であり、変更できません。

9
Paolo Tedesco

robのanswer が提供する構文糖が本当に好きです。

const myConst = 42

残念ながら、moduleSet-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

注:

  • 関数onlyは、モジュールからoutsideから呼び出されたときに機能します。定義されています。これは意図した使用例ですが、同じモジュールから呼び出されるかどうか(この場合Set-Variable -scope 1が機能するはずです)を確認するときに、チェックを追加したいと思います。
  • -Meanとの一貫性を保つために、パラメーターの名前を-ValueからSet-Variableに変更しました。
  • この関数は、オプションでPrivateReadOnly、およびAllScopeフラグを設定するように拡張できます。 PSVariable constructor の3番目の引数に目的の値を追加するだけです。これは、上記のスクリプトでNew-Objectを介して呼び出されます。
3
zett42