次の方法で共有


about_Command_Precedence

簡単な説明

PowerShell で実行するコマンドを決定する方法について説明します。

長い説明

コマンドの優先順位は、セッションに同じ名前の複数のコマンドが含まれている場合に実行するコマンドを PowerShell で決定する方法を説明します。 セッション内のコマンドは、非表示にしたり、同じ名前のコマンドに置き換えたりできます。 この記事では、非表示のコマンドを実行する方法と、コマンド名の競合を回避する方法について説明します。

コマンドの優先順位

PowerShell セッションに同じ名前のコマンドが複数含まれている場合、PowerShell は次の規則を使用して実行するコマンドを決定します。

コマンドへのパスを指定すると、PowerShell はパスで指定された場所でコマンドを実行します。

たとえば、次のコマンドは、C:\TechDocs ディレクトリで FindDocs.ps1 スクリプトを実行します。

C:\TechDocs\FindDocs.ps1

完全なパスを使用して、任意の実行可能コマンドを実行できます。 セキュリティ機能として、PowerShell は、$Env:PATH 環境変数にリストされているパスにコマンドがない限り、PowerShell スクリプトやネイティブ コマンドを含む実行可能コマンドを実行しません。

現在のディレクトリにある実行可能ファイルを実行するには、完全なパスを指定するか、現在のディレクトリを表す相対パス .\ を使用します。

たとえば、現在のディレクトリで FindDocs.ps1 ファイルを実行するには、次のように入力します。

.\FindDocs.ps1

パスを指定しない場合、PowerShell はコマンドの実行時に次の優先順位を使用します。

  1. 別名
  2. 機能
  3. コマンドレット (コマンドレットの名前解決 参照)
  4. 外部実行可能ファイル (PowerShell スクリプト ファイルを含む)

そのため、「help」と入力すると、PowerShell は最初に helpという名前のエイリアス、次に helpという名前の関数、最後に helpという名前のコマンドレットを探します。 検索した最初の help 項目が実行されます。

たとえば、セッションにコマンドレットと関数 (どちらも Get-Mapという名前) が含まれている場合、Get-Map入力すると、PowerShell によって関数が実行されます。

手記

これは、読み込まれたコマンドにのみ適用されます。 現在のセッションに読み込まれていないモジュール内に build の名前を持つ関数の build 実行可能ファイルとエイリアス Invoke-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を使用します。

モジュール修飾名を使用する

コマンドレットのモジュール修飾名を使用すると、同じ名前の項目によって非表示にされたコマンドを実行できます。 たとえば、microsoft.PowerShell.Utility Get-Date モジュール名で修飾することで、 コマンドレットを実行できます。 モジュール修飾名を使用すると、$PSModuleAutoLoadingPreferenceの値に応じて、モジュールをセッションに自動的にインポートできます。

手記

モジュール名を使用して変数またはエイリアスを修飾することはできません。

モジュール修飾名を使用すると、実行するコマンドを確実に実行できます。 これは、配布するスクリプトを記述するときにコマンドレットを呼び出す場合に推奨される方法です。

次の例は、モジュール名を含めることでコマンドを修飾する方法を示しています。

大事な

モジュール修飾では、バックスラッシュ文字 (\) を使用して、プラットフォームに関係なく、モジュール名とコマンド名を区切ります。

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

New-Map モジュールから MapFunctions コマンドを実行するには、そのモジュール修飾名を使用します。

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-Module Get-Command 呼び出しと組み合わせて実行することもできます。

呼び出し演算子は、子スコープ内の文字列とスクリプト ブロックを実行します。 詳細については、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 モジュールまたは別のセッションからコマンドをセッションにインポートする場合は、Prefix または Import-PSSession コマンドレットの パラメーターを使用して、コマンド名の名詞にプレフィックスを追加できます。

たとえば、次のコマンドは、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 環境変数に拡張機能を追加する必要があります。

こちらも参照ください