about_Command_Precedence
トピック
about_Command_Precedence
簡易説明
Windows PowerShell で実行するコマンドがどのように決定されるかについて説明します。
詳細説明
このトピックでは、特に 1 つのセッションに同じ名前の複数のコマンドが存在する場合に、
Windows PowerShell で実行するコマンドがどのように決定されるかについて説明します。
また、既定では実行されないコマンドを実行する方法と、セッション内でコマンド名の競合
を回避する方法についても説明します。
コマンドの優先順位
1 つのセッションに同じ名前のコマンドが存在する場合、Windows PowerShell では、次の規則
に従って実行するコマンドが決定されます。
これらの規則は、モジュール、スナップイン、およびその他のセッションから現在のセッション
にコマンドを追加した場合に非常に重要になります。
-- コマンドにパスを指定した場合、Windows PowerShell はパスで指定した場所にあるコマンド
を実行します。
たとえば、次のコマンドは C:\TechDocs ディレクトリにある FindDocs.ps1 スクリプトを実
行します。
C:\TechDocs\FindDocs.ps1
セキュリティ機能として、Windows PowerShell では、Path 環境変数 ($env:path) に含まれ
ているパスにあるコマンドか、スクリプト ファイルのパスを指定しない限り、Windows
PowerShell スクリプトなどの実行可能コマンド (ネイティブ コマンド) は実行されません。
現在のディレクトリにあるスクリプトを実行するには、完全なパスを指定するか、または現
在のディレクトリを表すピリオド (.) を入力します。
たとえば、現在のディレクトリ内の FindDocs.ps1 ファイルを実行するには、次のように入
力します。
.\FindDocs.ps1
-- パスを指定しなかった場合、Windows PowerShell は次の優先順位でコマンドを実行します。
1. エイリアス
2. 関数
3. コマンドレット
4. ネイティブ Windows コマンド
したがって、「help」と入力した場合、Windows PowerShell はまず "help" という名前の
エイリアスを探し、次に "Help" という名前の関数、そして "Help" という名前のコマンド
レットを探します。最初に見つかった "help" 項目が実行されます。
たとえば、Get-Map という名前の関数があるとします。ここで、Get-Map という名前のコマ
ンドレットを追加またはインポートします。「Get-Map」と入力すると、既定では関数が
Windows PowerShell によって実行されます。
-- 同じ名前を持つ同じ種類の項目がセッションに存在する場合、たとえば 2 つのコマンド
レットに同じ名前が付いている場合は、一番最後にセッションに追加された項目が実行され
ます。
たとえば、Get-Date という名前のコマンドレットがあるとします。ここで、Get-Date とい
う名前のコマンドレットをもう 1 つインポートします。「Get-Date」と入力する
と、既定では、最後にインポートされたコマンドレットが Windows PowerShell によって実
行されます。
隠し項目および置換された項目
これらの規則の結果として、項目が同じ名前の項目で置き換わったり、隠れた状態になる場合が
あります。
-- このような場合に、たとえばモジュールまたはスナップイン名で項目名を修飾することに
よって元の項目にアクセスできるのであれば、その項目は "隠れている" 状態になってい
ます。
たとえば、セッションに存在するコマンドレットと同じ名前の関数をインポートした場合、
コマンドレットは隠れた状態になります (ただし、置換されたわけではありません)。これ
は、コマンドレットがスナップインまたはモジュールからインポートされているためです。
-- 元の項目にアクセスできない場合は、項目は "置換" または "上書き" された状態です。
たとえば、セッションに存在する変数と同じ名前の変数をインポートした場合、元の変数は
置換され、アクセスできなくなります。変数はモジュール名で修飾できません。
また、コマンド ラインに関数を入力してから、同じ名前の関数をインポートした場合、元
の関数は置換されてアクセスできなくなります。
隠れているコマンドの実行
特定のコマンドを実行するには、そのコマンドと同じ名前を持っている可能性のある他のコマ
ンドと区別するための項目プロパティを指定します。
この方法は任意のコマンドの実行に使用できますが、隠れているコマンドの実行には特に便利
です。
この方法は、記述したスクリプトを配布する予定がある場合に、ベスト プラクティスとして使
用することをお勧めします。そのスクリプトが実行されるセッション内にどんなコマンドが存在
するか、予測できないためです。
修飾名
Windows PowerShell スナップインやモジュール、または別のセッションからインポートした
コマンドは、インポート元のモジュール名やスナップイン名でコマンド名を修飾することで実行
できます。
コマンドは修飾できますが、変数やエイリアスは修飾できません。
たとえば、Microsoft.PowerShell.Utility スナップインの Get-Date コマンドレットが、同じ
名前のエイリアス、関数、またはコマンドレットによって隠されている場合は、スナップインで
修飾したコマンドレット名を使用することで、このコマンドレットを実行できます。
Microsoft.PowerShell.Utility\Get-Date
MapFunctions モジュールによって追加された New-Map コマンドを実行するには、モジュール名
で修飾した名前を使用します。
MapFunctions\New-Map
コマンドのインポート元のスナップインまたはモジュールを検索するには、次の Get-Command
コマンド形式を使用します。
get-command <command-name> | format-list -property Name, PSSnapin, Module
たとえば、Get-Date コマンドレットのソースを検索するには、次のように入力します。
get-command get-date | format-list -property Name, PSSnapin, Module
Name : Get-Date
PSSnapIn : Microsoft.PowerShell.Utility
Module :
呼び出し演算子
呼び出し演算子 (&) を使用すると、Get-ChildItem (エイリアスは "dir")、Get-Command、また
は Get-Module コマンドを使用して取得できる任意のコマンドを実行できます。
コマンドを実行するには、Get-Command コマンドをかっこで囲み、呼び出し演算子 (&) を使用
します。
&(get-command ...)
- または -
&(dir ...)
たとえば、Map という名前のエイリアスによって隠されている Map という名前の関数がある場
合、その関数を実行するには、次のコマンドを使用します。
&(get-command -name map -type function)
- または -
&(dir function:\map)
隠れているコマンドの実行を容易にするために、コマンドを変数に保存することもできます。
たとえば、次のコマンドでは、Map 関数を $myMap 変数に保存してから、呼び出し演算子を使用
して実行します。
$myMap = (get-command -name map -type function)
&($myMap)
インポート元がモジュールであるコマンドの場合は、次の形式を使用して実行できます。
& <PSModuleInfo-object> <command>
たとえば、FileCommands モジュールの Add-File コマンドレットを実行するには、次のコマン
ド シーケンスを使用します。
$FileCommands = get-module -name FileCommands
& $FileCommands Add-File
置換された項目
セッションで作成するかプロファイルを使用して追加した関数、変数、エイリアスなど、モジュー
ルまたはスナップインからインポートしたのではない項目は、同じ名前のコマンドで置換される
ことがあります。これらの項目は置換されると、アクセスできなくなります。
変数およびエイリアスは、呼び出し演算子や修飾名を使用して実行できないため、モジュールま
たはスナップインからインポートされた場合でも常に置換されます。
たとえば、現在のセッションで Get-Map 関数を入力した後、Get-Map という名前の関数をイン
ポートすると、元の関数が置換されます。現在のセッションで元の関数を取得することはできま
せん。
名前の競合の回避
コマンド名の競合を管理する最善の方法は、競合を防止することです。コマンドには、固有度の
高い名前または一意である可能性の高い名前を使用してください。たとえば、コマンド内の名詞
に自分のイニシャルや会社名の頭字語を追加します。
また、Windows PowerShell モジュールや別のセッションから現在のセッションにコマンドをイ
ンポートする場合は、Import-Module コマンドレットまたは Import-PSSession コマンドレット
の Prefix パラメーターを使用して、コマンド名の名詞にプレフィックスを追加します。
たとえば、DateFunctions モジュールをインポートする場合、次のコマンドを使用して、
Windows PowerShell に含まれる Get-Date コマンドレットと Set-Date コマンドレットとの競
合を回避します。
import-module -name DateFunctions -prefix ZZ
詳細については、「Import-Module」および「Import-PSSession」を参照してください。
関連項目
about_Path_Syntax
about_Aliases
about_Functions
Alias (プロバイダー)
Function (プロバイダー)
Get-Command
Import-Module
Import-PSSession