5. 変数

変数は、値の格納場所を表し、その値には型があります。 従来の手続き型プログラミング言語は、静的に型指定されます。つまり、変数のランタイム型はコンパイル時に宣言されたものです。 オブジェクト指向言語では、継承の概念が追加されます。これにより、変数のランタイム型をコンパイル時に宣言したものにすることも、その型から派生した型にすることもできます。 動的に型指定された言語であるため、PowerShell の変数には、厳密には型がありません。 実際、変数は定義されていません。これらは、最初に値が割り当てられたときに発生します。 また、変数は、指定された型の値を保持するように制約される場合があります (§5.3) が、その代入の型情報を、常に静的に検証することはできません。

異なるタイミングで、変数を代入 (§7.11) または ++‑‑ の演算子の使用 (§7.1.5§7.2.6) によって、異なる型の値に関連付けることができます。 変数に関連付けられている値が変更された場合、その値の型は変更される可能性があります。 たとえば、次のように入力します。

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

作成されていない変数を使用すると、$null 値が返されます。 変数が定義されているかどうかを確認するには、Test-Path コマンドレットを使用します。

5.1 writable location

writable location は、コマンドが読み取りと書き込みの両方のアクセス権を持つリソースを指定する式です。 writable location は、変数 (§5)、配列要素 (§9)、添字を介してアクセスされるハッシュテーブルで関連付けられた値 (§10)、プロパティ (§7.1.2)、またはプロバイダーによって管理されるストレージ (§3.1) にすることができます。

5.2 変数のカテゴリ

PowerShell では、静的変数、インスタンス変数、配列要素、ハッシュテーブルのキーと値のペア、パラメーター、通常の変数、プロバイダー ドライブの変数のカテゴリの変数が定義されています。 以後のサブセクションでは、これらの各カテゴリについて説明します。

次の例では

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "e:\Temp"
    ${E:output.txt} = 123
    $function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] は静的変数です
  • $date.Month はインスタンス変数です
  • $values[2] は配列要素です
  • $h1.FirstName は、対応する値が $h1['FirstName']Hashtable` キーです
  • $p1$p2 はパラメーターです。
  • $radius$circumference$date$month$values$value、および $h1 は通常の変数です
  • $Alias:A$Env:MyPath${E:output.txt} および $function:F は、対応するプロバイダー ドライブ上の変数です。
  • $Variable:v は実際には、完全修飾プロバイダー ドライブで記述された通常の変数です。

5.2.1 静的変数

型の特定のインスタンスではなく、オブジェクトの型に属するオブジェクトのデータ メンバーは、静的変数 と呼ばれます。 例については、§4.2.3§4.2.4.1、および §4.3.8 を参照してください。

PowerShell では、静的変数を含む新しい型を作成することはできません。ただし、このような型のオブジェクトは、ホスト環境によって提供される場合があります。

静的変数を含むオブジェクトを作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。

静的変数へのアクセスの詳細については、§7.1.2 を参照してください。

静的データ メンバーは、フィールドまたはプロパティにすることができます。

5.2.2 インスタンス変数

型自体ではなく、オブジェクトの型の特定のインスタンスに属するオブジェクトのデータ メンバーは、インスタンス変数 と呼ばれます。 例については、§4.3.1§4.3.2、および §4.3.3 を参照してください。

PowerShell ホスト環境では、インスタンス変数を含む新しい型を作成したり、既存の型に新しいインスタンス変数を追加したりする方法が提供される場合があります。

静的変数を含むオブジェクトを作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。

インスタンス変数へのアクセスの詳細については、§7.1.2 を参照してください。

インスタンス データ メンバーは、フィールドまたはプロパティにすることができます。

5.2.3 配列の要素

配列は、単項コンマ演算子 (§7.2.1)、sub-expression (§7.1.6)、array-expression (§7.1.7)、二項コンマ演算子 (§7.3)、範囲演算子 (§7.4)、または New-Object のコマンドレットを使用して作成できます。

配列の作成と削除に使用するメモリは、ホスト環境とガベージ コレクション システムによって管理されます。

配列と配列の要素については、§9 を参照してください。

5.2.4 ハッシュテーブルのキーと値のペア

ハッシュテーブルは、ハッシュ リテラル (§2.3.5.6) または New-Object のコマンドレットを使用して作成されます。 新しいキーと値のペアは、[] 演算子 (§7.1.4.3) を使用して追加できます。

ハッシュテーブルの作成と削除に使用するメモリは、ホスト環境とガベージ コレクション システムによって管理されます。

ハッシュテーブルについては、§10 を参照してください。

5.2.5 パラメーター

パラメーターは、親コマンドが呼び出されたときに作成され、呼び出しまたはホスト環境によって指定された引数の値で初期化されます。 親コマンドが終了すると、パラメーターは存在しなくなります。

パラメーターについては、 §8.10 を参照してください。

5.2.6 通常の変数

通常の変数 は、代入式 (§7.11) または foreach ステートメント (§8.4.4) によって定義されます。 一部の通常の変数は、ホスト環境で事前に定義されていますが、その他は一時的なものであり、実行時に必要に応じて表示されます。

通常の変数の有効期間とは、ストレージが予約されることが保証されているプログラム実行の一部です。 この有効期間は、それが関連付けられているスコープが始まると開始され、そのスコープの実行が終了するとすぐに終了します。 親スコープが再帰的または反復的に開始された場合は、毎回ローカル変数の新しいインスタンスが作成されます。

通常の変数によって参照されるストレージは、その変数の有効期間とは無関係に解放されます。

通常の変数の名前には、Variable: 名前空間プレフィックス (§5.2.7) を明示的に付けることができます。

5.2.7 プロバイダー ドライブの変数

プロバイダーとドライブの概念が §3.1 で導入され、各プロバイダーが独自の名前空間ドライブを提供できるようになりました。 これにより、ドライブのリソースに通常の変数と同様にアクセスできるようになります (§5.2.6)。 実際、通常の変数は、ファイル システム プロバイダー ドライブの変数に格納され (§3.1.5)、通常の名前または完全修飾された名前空間の名前でアクセスできます。

名前空間の変数型の中には、暗黙的に制約されるものがあります (§5.3)。

5.3 制約付き変数

既定では、変数によって任意の型の値を指定できます。 ただし、変数は、代入またはパラメーターで名前の前に型リテラルとしてその型を指定することによって、指定された型の値を指定するように 制約される 場合があります。 たとえば、次のように入力します。

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

名前空間 Env:Alias: 、またはファイル システム名前空間 (§2.3.2§3.1) に属するすべての変数が、暗黙的に型 string に制約されます。 名前空間 Function: (§2.3.2§3.1) に属するすべての変数が、暗黙的に型 scriptblock に制約されます。