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