編集メモ
重要
Windows PowerShell 言語仕様 3.0 は、2012 年 12 月に公開され、Windows PowerShell 3.0 に基づいています。 この仕様では、PowerShell の現在の状態は反映されません。 現在の状態を反映するようにこのドキュメントを更新する予定はありません。 このドキュメントは、履歴参照のためにここに示されています。
仕様文書は、Microsoft ダウンロード センターから Microsoft Word 文書として入手できます。https://www.microsoft.com/download/details.aspx?id=36389 Word 文書は、Microsoft Learn でプレゼンテーション用に変換されています。 変換中に、Docs プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。
変数は値の格納場所を表し、その値には型があります。 従来の手続き型プログラミング言語は静的に型指定されます。つまり、変数のランタイム型は、コンパイル時に宣言された変数です。 オブジェクト指向言語は継承の概念を追加します。これにより、変数のランタイム型を、コンパイル時に宣言した変数、またはその型から派生した型にすることができます。 動的に型指定された言語である 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 書き込み可能な場所
書き込み可能な場所 は、コマンドが読み取りと書き込みの両方のアクセス権を持つリソースを指定する式です。 書き込み可能な場所は、変数 (§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は、対応する値が $h 1['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、
PowerShell では、静的変数を含む新しい型を作成する方法はありません。ただし、このような型のオブジェクトは、ホスト環境によって提供される場合があります。
静的変数を含むオブジェクトを作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。
静的変数 アクセスする方法については、§7.1.2 を参照してください。
静的データ メンバーには、フィールドまたはプロパティを指定できます。
5.2.2 インスタンス変数
型自体ではなく、オブジェクトの型の特定のインスタンスに属するオブジェクトのデータ メンバーは、インスタンス変数呼び出されます。 例については、§4.3.1、
PowerShell ホスト環境では、インスタンス変数を含む新しい型を作成したり、既存の型に新しいインスタンス変数を追加したりする方法が提供される場合があります。
静的変数を含むオブジェクトを作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。
インスタンス変数へのアクセスについては、§7.1.2
インスタンス データ メンバーには、フィールドまたはプロパティを指定できます。
5.2.3 配列要素
配列は、単項コンマ演算子 (§7.2.1)、サブ式 (§7.1.6)、array 式 (§7.1.7)、バイナリ コンマ演算子 (§7.3)、範囲演算子 (§7.4)、または New-Object コマンドレットで作成できます。
配列を作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。
配列と配列要素については、§9で説明します。
5.2.4 ハッシュテーブルキーと値のペア
Hashtable は、ハッシュ リテラル (§2.3.5.6[] 演算子 (§7.1.4.3) を使用して、新しいキーと値のペアを追加できます。
ハッシュテーブルを作成および削除するためのメモリは、ホスト環境とガベージ コレクション システムによって管理されます。
ハッシュテーブルについては、§10で説明します。
5.2.5 パラメーター
パラメーターは、親コマンドが呼び出されたときに作成され、呼び出しまたはホスト環境で指定された引数の値で初期化されます。 親コマンドが終了すると、パラメーターは存在しなくなります。
パラメーターについては、§8.10で説明します。
5.2.6 通常の変数
通常の変数
通常の変数の有効期間は、プログラムの実行の一部であり、その間にストレージが予約されていることが保証されます。 この有効期間は、関連付けられているスコープへのエントリから始まり、そのスコープの実行が終了する前に終了します。 親スコープを再帰的または反復的に入力すると、ローカル変数の新しいインスタンスが毎回作成されます。
通常の変数によって参照されるストレージは、その変数の有効期間とは無関係に再利用されます。
通常の変数には、変数 名前空間プレフィックス (§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型に暗黙的に制約されます。 名前空間 関数に属するすべての変数: (§2.3.2, §3.1) は、型 scriptblockに暗黙的に制約されます。
PowerShell