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

コマンドレットで使用-option ConstantしますSet-Variable

Set-Variable myvar -option Constant -value 100

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


1
うわー、それは不格好です。そのためにはSet-Variableを使用する必要がありますね。
トム・ヘーゼル

はい、それを行うための不格好な方法はありません:)
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
クリス・J

11

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

例えば:

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

チェックする、

$test | gm

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


5

ロブの答えが提供する構文糖が本当に好きです:

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
  • 関数を拡張して、オプションでPrivateReadOnlyおよびAllScopeフラグを設定できます。上記のスクリプトで呼び出されるPSVariableコンストラクタの 3番目の引数に必要な値を追加するだけNew-Objectです。

-4

PowerShell v5.0では、

[静的] [整数] $変数= 42

[静的] [日時] $ thisday

など。


2
ps 5.1では動作しません。タイプ[静的]が見つかりません。
ThomasMX

5
言うまでもなく、staticは定数と同じではありません
コロブキャニオン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.