about_Command_Precedence
簡単な説明
PowerShell で実行するコマンドを決定する方法について説明します。
詳細な説明
コマンドの優先順位は、セッションに同じ名前の複数のコマンドが含まれている場合に実行するコマンドを PowerShell で決定する方法を説明します。 セッション内のコマンドは、非表示にしたり、同じ名前のコマンドに置き換えたりできます。 この記事では、非表示のコマンドを実行する方法と、コマンド名の競合を回避する方法について説明します。
コマンドの優先順位
PowerShell セッションに同じ名前のコマンドが複数含まれている場合、PowerShell は次の規則を使用して実行するコマンドを決定します。
コマンドへのパスを指定すると、PowerShell はパスで指定された場所でコマンドを実行します。
たとえば、次のコマンドは、 C:\TechDocs
ディレクトリで FindDocs.ps1 スクリプトを実行します。
C:\TechDocs\FindDocs.ps1
完全なパスを使用して、任意の実行可能コマンドを実行できます。 セキュリティ機能として、PowerShell では、powerShell スクリプトやネイティブ コマンドを含む実行可能コマンドは実行されません。ただし、コマンドが $env:Path
環境変数に一覧表示されているパスにある場合を除きます。
現在のディレクトリにある実行可能ファイルを実行するには、完全なパスを指定するか、現在のディレクトリを表す相対パス .\
を使用します。
たとえば、現在のディレクトリで FindDocs.ps1
ファイルを実行するには、次のように入力します。
.\FindDocs.ps1
パスを指定しない場合、PowerShell はコマンドの実行時に次の優先順位を使用します。
- エイリアス
- 機能
- コマンドレット ( Cmdlet の名前解決を参照してください)
- 外部実行可能ファイル (PowerShell スクリプト ファイルを含む)
そのため、 help
を入力すると、PowerShell は最初に help
という名前のエイリアス、次に Help
という名前の関数、最後に Help
という名前のコマンドレットを探します。 検索した最初の help
項目が実行されます。
たとえば、セッションにコマンドレットと関数 (どちらも Get-Map
という名前) が含まれている場合、 Get-Map
入力すると、PowerShell によって関数が実行されます。
Note
これは、読み込まれたコマンドにのみ適用されます。 現在のセッションに読み込まれていないモジュール内にInvoke-Build
の名前を持つ関数のbuild
実行可能ファイルとエイリアス build
がある場合、PowerShell は代わりにbuild
実行可能ファイルを実行します。 外部実行可能ファイルが見つかると、モジュールは自動的に読み込まれません。 外部実行可能ファイルが見つからない場合にのみ、指定された名前のエイリアス、関数、またはコマンドレットが呼び出されます。
同じ名前のアイテムを解決する
これらのルールの結果、項目は同じ名前の項目で置き換えたり非表示にしたりできます。
項目は hidden または 表示されます モジュール名で項目名を修飾するなどして、元のアイテムに引き続きアクセスできる場合。
たとえば、コマンドレットと同じ名前の関数をセッションにインポートした場合、コマンドレットは hidden になりますが、置き換えはありません。 コマンドレットを実行するには、モジュール修飾名を指定します。
アイテムが に配置 または 上書きされた場合元のアイテムにアクセスできなくなります。
たとえば、セッション内の変数と同じ名前の変数をインポートすると、元の変数が置き換えられます。 モジュール名で変数を修飾することはできません。
コマンド ラインで関数を作成し、同じ名前の関数をインポートすると、元の関数が置き換えられます。
非表示のコマンドの検索
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
を使用します。
モジュール修飾名を使用する
コマンドレットのモジュール修飾名を使用すると、同じ名前の項目によって非表示にされたコマンドを実行できます。 たとえば、モジュール名 Microsoft.PowerShell.Utility またはそのパスで修飾することで、Get-Date
コマンドレットを実行できます。 モジュール修飾名を使用すると、 $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)
非表示のコマンドを変数に保存して、実行を容易にすることもできます。
たとえば、次のコマンドは、$myMap
変数にMap
関数を保存し、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
パラメーターを使用して、コマンド名の名詞にプレフィックスを追加できます。
たとえば、次のコマンドは、DateFunctions
モジュールをインポートするときに PowerShell に付属するGet-Date
およびSet-Date
コマンドレットとの競合を回避します。
Import-Module -Name DateFunctions -Prefix ZZ
外部実行可能ファイルの実行
Windows の場合。 PowerShell は、 $env:PATHEXT
環境変数に一覧表示されているファイル拡張子を実行可能ファイルとして扱います。 Windows 実行可能ファイルではないファイルは、処理するために Windows に渡されます。 Windows はファイルの関連付けを検索し、拡張機能の既定の Windows シェル動詞を実行します。 Windows でファイル拡張子による実行をサポートするには、関連付けをシステムに登録する必要があります。
CMD コマンド シェルの ftype
コマンドと assoc
コマンドを使用して、ファイル拡張子の実行可能エンジンを登録できます。 PowerShell には、ファイル ハンドラーを登録するダイレクト メソッドはありません。 詳細については、 ftype コマンドのドキュメントを参照してください。
PowerShell で現在のセッションでファイル拡張子を実行可能ファイルとして表示するには、 $env:PATHEXT
環境変数に拡張機能を追加する必要があります。
関連項目
PowerShell