ja-JP/about_Command_Precedence.help.txt

TOPIC
    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 はコマンドを実行する際に次の優先順位を
    使用します。

      1. Alias(エイリアス)
      2. Function(関数)
      3. Cmdlet(「コマンドレット名の解決」を参照)
      4. 外部実行可能ファイル(PowerShell スクリプトファイルを含む)

    したがって、help と入力すると、PowerShell はまず help という名前の
    エイリアスを探し、次に help という名前の関数を探し、最後に help という
    名前のコマンドレットを探します。そして、最初に見つかった help 項目を
    実行します。

    たとえば、セッションに Get-Map という名前のコマンドレットと関数の両方が
    含まれている場合、Get-Map と入力すると PowerShell は関数を実行します。

    注: これは読み込み済みのコマンドにのみ適用されます。build という実行
    可能ファイルがあり、現在のセッションに読み込まれていないモジュール内に
    Invoke-Build という名前の関数を指す build というエイリアスがある場合、
    PowerShell は build 実行可能ファイルの方を実行します。外部実行可能ファイル
    が見つかった場合、モジュールは自動読み込みされません。外部実行可能ファイル
    が見つからなかった場合にのみ、指定された名前のエイリアス、関数、または
    コマンドレットが呼び出されます。

    同じ名前を持つ項目の解決

    これらの規則の結果として、項目は同じ名前を持つ項目によって置き換えられ
    たり隠されたりすることがあります。

    項目が「隠されている(hidden)」または「シャドウされている(shadowed)」
    場合でも、モジュール名で項目名を修飾するなどの方法で、元の項目に引き続き
    アクセスできます。

    たとえば、セッション内のコマンドレットと同じ名前の関数をインポートした
    場合、コマンドレットは「隠され」ますが、置き換えられはしません。モジュール
    修飾名を指定することで、そのコマンドレットを実行できます。

    項目が「置き換えられた(replaced)」または「上書きされた(overwritten)」
    場合、元の項目にはアクセスできなくなります。

    たとえば、セッション内の変数と同じ名前の変数をインポートした場合、元の
    変数は置き換えられます。変数をモジュール名で修飾することはできません。

    コマンドラインで関数を作成した後、同じ名前の関数をインポートすると、
    元の関数は置き換えられます。

    隠されたコマンドを見つける

    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 変数に保存し、呼び出し演算子を
    使ってそれを実行します。

        $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 環境変数に追加する必要があります。

関連項目
    about_Aliases
    about_Functions
    about_Path_Syntax
    about_Operators
    Get-Command
    Import-Module
    Import-PSSession

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP