about_Command_Precedence
簡単な説明
PowerShell で実行するコマンドを決定する方法について説明します。
詳細な説明
コマンドの優先順位は、セッションに同じ名前の複数のコマンドが含まれている場合に実行するコマンドを PowerShell で決定する方法を説明します。 セッション内のコマンドは、非表示にしたり、同じ名前のコマンドに置き換えたりできます。 この記事では、非表示のコマンドを実行する方法と、コマンド名の競合を回避する方法について説明します。
コマンドの優先順位
PowerShell セッションに同じ名前のコマンドが複数含まれている場合、PowerShell は次の規則を使用して実行するコマンドを決定します。
コマンドへのパスを指定すると、PowerShell はパスで指定された場所でコマンドを実行します。
たとえば、次のコマンドはディレクトリで FindDocs.ps1 スクリプトを C:\TechDocs
実行します。
C:\TechDocs\FindDocs.ps1
完全なパスを使用して、任意の実行可能コマンドを実行できます。 セキュリティ機能として、PowerShell スクリプトやネイティブ コマンドを含む実行可能コマンドは実行されません。ただし、コマンドが環境変数に一覧表示されているパスに配置されている場合を $env:Path
除きます。
現在のディレクトリにある実行可能ファイルを実行するには、完全なパスを指定するか、相対パス .\
を使用して現在のディレクトリを表します。
たとえば、現在のディレクトリでファイルを FindDocs.ps1
実行するには、次のように入力します。
.\FindDocs.ps1
パスを指定しない場合、PowerShell はコマンドの実行時に次の優先順位を使用します。
- エイリアス
- 機能
- コマンドレット (コマンドレットの名前解決を参照)
- 外部実行可能ファイル (PowerShell スクリプト ファイルを含む)
したがって、入力help
した場合、PowerShell は最初にエイリアス、次に関数という名前help
Help
を探し、最後にコマンドレットを検索Help
します。 検索した最初 help
の項目が実行されます。
たとえば、セッションにコマンドレットと関数 (両方とも名前付き Get-Map
) が含まれている場合、入力 Get-Map
すると、PowerShell によって関数が実行されます。
Note
これは、読み込まれたコマンドにのみ適用されます。 現在のbuild
セッションに読み込まれていないモジュール内の名前を持つ関数のInvoke-Build
実行可能ファイルとエイリアスbuild
がある場合、PowerShell は代わりに実行可能ファイルをbuild
実行します。 外部実行可能ファイルが見つかると、モジュールは自動的に読み込まれません。 外部実行可能ファイルが見つからない場合にのみ、指定された名前のエイリアス、関数、またはコマンドレットが呼び出されます。
同じ名前のアイテムを解決する
これらのルールの結果、項目は同じ名前の項目で置き換えたり非表示にしたりできます。
モジュール名で項目名を修飾するなどして元のアイテムにアクセスできる場合、アイテムは 非表示 または シャドウ されます。
たとえば、コマンドレットと同じ名前の関数をセッションにインポートした場合、コマンドレットは 非表示になりますが、置き換えはありません。 コマンドレットを実行するには、モジュール修飾名を指定します。
アイテムが置き換えられたり上書きされたりすると、元のアイテムにアクセスできなくなります。
たとえば、セッション内の変数と同じ名前の変数をインポートすると、元の変数が置き換えられます。 モジュール名で変数を修飾することはできません。
コマンド ラインで関数を作成し、同じ名前の関数をインポートすると、元の関数が置き換えられます。
非表示のコマンドの検索
Get-Command コマンドレットの All パラメーターは、非表示または置き換えられた場合でも、指定した名前のすべてのコマンドを取得します。 PowerShell 3.0 以降では、既定では、 Get-Command
コマンド名を入力したときに実行されるコマンドのみが取得されます。
次の例では、セッションに関数と Get-Date コマンドレットが含まれていますGet-Date
。 どのコマンドが最初に選択されているかを判断するために使用 Get-Command
できます。
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
All パラメーターを使用して、使用可能なGet-Date
コマンドを一覧表示します。
Get-Command Get-Date -All
CommandType Name Version Source
----------- ---- ------- ------
Function Get-Date
Cmdlet Get-Date 7.0.0.0 Microsoft.PowerShell.Utility
Get-Command where -All
CommandType Name Version Source
----------- ---- ------- ------
Alias where -> Where-Object
Application where.exe 10.0.22621.1 C:\Windows\system32\where.exe
特定のコマンドを実行するには、同じ名前を持つ可能性がある他のコマンドとコマンドを区別する修飾情報を含めます。
コマンドレットの場合は、モジュール修飾名を使用できます。 実行可能ファイルの場合は、ファイル拡張子を含めることができます。 たとえば、実行可能なバージョンの where
使用 where.exe
を実行するには、
モジュール修飾名を使用する
コマンドレットのモジュール修飾名を使用すると、同じ名前の項目によって非表示にされたコマンドを実行できます。 たとえば、コマンドレットを Get-Date
モジュール名 Microsoft.PowerShell.Utility またはそのパスで修飾することで実行できます。 モジュール修飾名を使用する場合、モジュールの値 $PSModuleAutoLoadingPreference
に応じて、セッションにモジュールを自動的にインポートできます。
Note
モジュール名を使用して変数またはエイリアスを修飾することはできません。
モジュール修飾名を使用すると、実行するコマンドを確実に実行できます。 これは、配布するスクリプトを記述するときにコマンドレットを呼び出す場合に推奨される方法です。
次の例は、モジュール名を含めることでコマンドを修飾する方法を示しています。
重要
モジュール修飾では、プラットフォームに関係なく、バックスラッシュ文字 (\
) を使用してモジュール名とコマンド名を区切ります。
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
モジュールからMapFunctions
コマンドをNew-Map
実行するには、モジュール修飾名を使用します。
MapFunctions\New-Map
コマンドのインポート元のモジュールを検索するには、コマンドの ModuleName プロパティを使用します。
(Get-Command <command-name>).ModuleName
たとえば、コマンドレットのソースを検索するには、次のように Get-Date
入力します。
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
モジュールへのパスを使用してコマンドの名前を修飾する場合は、パス区切り記号としてスラッシュ (/
) を使用し、コマンド名の前に円記号 (\
) を使用する必要があります。 コマンドレットを実行するには、次の例を Get-Date
使用します。
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
パスには、完全パスまたは現在の場所に対する相対パスを指定できます。
Windows では、ドライブ修飾パスを使用することはできません。 前の例に示すように、UNC パス、または現在のドライブに対する相対パスを使用する必要があります。
次の例では、現在の場所がドライブ内 C:
にあることを前提としています。
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
呼び出し演算子を使用する
また、呼び出し演算子 (&
) を使用して、非表示のコマンドを Get-ChildItem (別名) dir
Get-Command
または Get-Module の呼び出しと組み合わせて実行することもできます。
呼び出し演算子は、子スコープ内の文字列とスクリプト ブロックを実行します。 詳細については、「about_Operators」を参照してください。
たとえば、次のコマンドを使用して、名前付きのエイリアスMap
によって非表示になっている名前Map
の関数を実行します。
& (Get-Command -Name Map -CommandType Function)
または
& (dir Function:\map)
非表示のコマンドを変数に保存して、実行を容易にすることもできます。
たとえば、次のコマンドは、関数をMap
$myMap
変数に保存し、演算子をCall
使用して関数を実行します。
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
置き換えられた項目
置き換えられた項目は、アクセスできなくなったアイテムです。 同じ名前の項目をモジュールからインポートすることで、項目を置き換えることができます。
たとえば、セッションに関数を Get-Map
入力し、呼び出された Get-Map
関数をインポートすると、元の関数が置き換えられます。 現在のセッションでは取得できません。
変数とエイリアスは、呼び出し演算子または修飾名を使用して実行できないため、非表示にできません。 モジュールから変数とエイリアスをインポートすると、セッション内の変数が同じ名前に置き換えられます。
コマンドレットの名前解決
コマンドレットの修飾名を使用しない場合、PowerShell チェックコマンドレットが現在のセッションに読み込まれているかどうかを確認します。 同じコマンドレット名を含む複数のモジュールが読み込まれている場合、PowerShell はアルファベット順に見つかった最初のモジュールのコマンドレットを使用します。
コマンドレットが読み込まれていない場合、PowerShell はインストールされているモジュールを検索し、コマンドレットを含む最初のモジュールを自動読み込みし、そのコマンドレットを実行します。
PowerShell は、環境変数で定義されている各パス内のモジュールを $env:PSModulePath
検索します。 パスは、変数に一覧表示されている順序で検索されます。 各パス内で、モジュールはアルファベット順に検索されます。 PowerShell は、検出された最初の一致のコマンドレットを使用します。
名前の競合の回避
コマンド名の競合を管理する最善の方法は、競合を防ぐことです。 コマンドに名前を付けるとき、一意の名前を使用します。 たとえば、コマンドの名詞にイニシャルや会社名の頭字語を追加します。
PowerShell モジュールまたは別のセッションからセッションにコマンドをインポートする場合は、Import-Module または Import-PSSession コマンドレットのパラメーターを使用Prefix
して、コマンド名の名詞にプレフィックスを追加できます。
たとえば、次のコマンドは、モジュールを Get-Date
インポートするときに PowerShell に付属するコマンドレットとの Set-Date
競合を DateFunctions
回避します。
Import-Module -Name DateFunctions -Prefix ZZ
外部実行可能ファイルの実行
Windows の場合。 PowerShell は、環境変数に一覧表示されているファイル拡張子を $env:PATHEXT
実行可能ファイルとして扱います。 Windows 実行可能ファイルではないファイルは、処理するために Windows に渡されます。 Windows はファイルの関連付けを検索し、拡張機能の既定の Windows シェル動詞を実行します。 Windows でファイル拡張子による実行をサポートするには、関連付けをシステムに登録する必要があります。
CMD コマンド シェルのコマンドを使用して、ファイル拡張子のftype
assoc
実行可能エンジンを登録できます。 PowerShell には、ファイル ハンドラーを登録するダイレクト メソッドはありません。 詳細については、ftype コマンドのドキュメントを参照してください。
PowerShell でファイル拡張子を現在のセッションで実行可能ファイルとして表示するには、拡張機能を環境変数に $env:PATHEXT
追加する必要があります。
関連項目
PowerShell