概要
PowerShell でコマンドを解析する方法について説明します。
詳細説明
コマンド プロンプトでコマンドを入力すると、PowerShell はコマンド テキストを "トークン" と呼ばれる一連のセグメントに分割し、各 "トークン" の解釈方法を決定します。
たとえば、次のように入力します。
Write-Host 本
PowerShell は、次のコマンドを "Write-Host" と "book" の 2 つのトークンに分割し、各トークンを個別に解釈します。
コマンドを処理するとき、PowerShell パーサーは式モードまたは引数モードで動作します。
式モードでは、文字列値は引用符で囲む必要があります。 引用符で囲まれていない数値は、(一連の文字としてではなく) 数値として扱われます。
引数モードでは、各値は、ドル記号 ($)、アットマーク (@)、単一引用符 (')、二重引用符 (")、または左括弧 (()) のいずれかの特殊文字で始まっていない限り、展開可能な文字列として扱われます。
これらの文字のいずれかが前に付いている場合、値は値式として扱われます。
次の表に、式モードと引数モードで処理されたコマンドの例と、それらのコマンドによって生成される結果を示します。
| 例 | モード | 結果 |
|---|---|---|
| 2+2 | 表現 | 4 (整数) |
| Write-Output 2+2 | 引数 | "2+2" (文字列) |
| Write-Output (2+2) | 表現 | 4 (整数) |
| $a = 2+2 | 表現 | $a = 4 (整数) |
| Write-Output $a | 表現 | 4 (整数) |
| Write-Output $a/H | 引数 | "4/H" (文字列) |
すべてのトークンは、ブール値や文字列など、ある種のオブジェクトタイプとして解釈できます。 PowerShell は、式からオブジェクトの種類を決定しようとします。 オブジェクトの種類は、コマンドで想定されるパラメーターの種類と、引数を正しい型に変換する方法を PowerShell が認識しているかどうかによって異なります。 次の表に、式によって返される値に割り当てられた型の例をいくつか示します。
| 例 | モード | 結果 |
|---|---|---|
| Write-Output !1 | 引数 | "!1" (文字列) |
| Write-Output (!1) | 式 | False (ブール値) |
| Write-Output (2) | 式 | 2 (整数) |
PowerShell 3.0 で導入された解析停止記号 (--%) は、入力を PowerShell コマンドまたは式として解釈しないように PowerShell に指示します。
PowerShell で実行可能プログラムを呼び出す場合は、プログラム引数の前に停止解析記号を配置します。 この手法は、誤った解釈を防ぐためにエスケープ文字を使用するよりもはるかに簡単です。
停止解析シンボルが検出されると、PowerShell は行の残りの文字をリテラルとして扱います。 実行する唯一の解釈は、標準の Windows 表記を使用する環境変数 ( %USERPROFILE%など) の値を置き換えることです。
解析停止記号は、次の改行またはパイプライン文字まで有効です。 継続文字 (') を使用してその効果を拡張したり、コマンド区切り記号 (;) を使用してその効果を終了したりすることはできません。
たとえば、次のコマンドは Icacls プログラムを呼び出します。
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
PowerShell 2.0 でこのコマンドを実行するには、エスケープ文字を使用して PowerShell がかっこを誤って解釈しないようにする必要があります。
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
PowerShell 3.0 以降では、停止解析記号を使用できます。
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
PowerShell は、次のコマンド文字列を Icacls プログラムに送信します。
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F