about_Command_Precedence

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

概要をここに挿入してください。

トピック

about_Command_Precedence

概要

Windows PowerShell® が実行するコマンドを決定するしくみについて説明します。

詳細説明

このトピックでは、特に、セッションに同じ名前を持つコマンドが 1 つ以上含まれている場合、Windows PowerShell が実行するコマンドを決定する方法について説明します。また、既定では実行されないコマンドの実行方法と、セッションでコマンド名の競合を回避する方法についても説明します。

コマンドの優先順位

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

モジュール、スナップイン、その他のセッションからコマンドを追加する場合、これらの規則は非常に重要になります。

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

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

             C:\TechDocs\FindDocs.ps1

セキュリティ機能として、Windows PowerShell は、Windows PowerShell スクリプトなどの実行可能 (ネイティブ) コマンドを実行しません。ただし、そのコマンドが Path 環境変数 ($env:path) に記載されているパスにある場合や、スクリプト ファイルへのパスを指定する場合を除きます。

現在のディレクトリ内にあるスクリプトを実行するには、完全なパスを指定するか、または現在のディレクトリを表すにドット (.) を入力します。

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

             .\FindDocs.ps1

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

              1. Alias
              2. Function
              3. Cmdlet 
              4. Native Windows commands

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

たとえば、セッションに Get-Map 関数があり、Get-Map という名前のコマンドレットをインポートする場合です。既定では、「Get-Map」と入力すると、Windows PowerShell は Get-Map 関数を実行します。

-- 同じ名前の 2 つのコマンドレットなど、セッションに同じ名前を持つ同じ種類の項目が含まれる場合、Windows PowerShell はセッションに追加された時期が最新の項目を実行します。

たとえば、Get-Date という名前のコマンドレットがあり、Get-Date という名前の別のコマンドレットをインポートした場合、「Get-Date」と入力すると、Windows PowerShell は最近インポートされたコマンドレットを実行します。

隠れている項目と置換される項目

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

-- モジュールまたはスナップイン名を使用して項目名を修飾するなど、元の項目に引き続きアクセス可能な場合、項目は「非表示」または「影付き」です。

たとえば、セッションでコマンドレットと同じ名前を持つ関数をインポートする場合、スナップインまたはモジュールからインポートされたため、コマンドレットは隠されます (ただし、置き換えられません)。

-- 元の項目にアクセスできなくなった場合、項目は、「置換」または「上書き」されます。

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

また、コマンドラインで関数を入力し、同じ名前を持つ関数をインポートする場合、元の関数は置き換えられてアクセスできなくなります。

隠れているコマンドの検索

Get-Command コマンドレットの All パラメーターは、隠れているか置き換えられている場合でも、指定された名前を持つすべてのコマンドを取得します。Windows PowerShell 3.0 以降、既定では、Get-Command コマンドは、コマンド名が入力されたときに実行したコマンドのみを取得します。

次の例で、セッションには Get-Date 関数と Get-Date コマンドレットが含まれています。

次のコマンドは、「Get-Date」と入力するときに実行される、Get-Date コマンドを取得します。

          PS C:\> Get-Command Get-Date

          CommandType     Name                                               ModuleName
          -----------     ----                                               ----------
          Function        get-date

次のコマンドは、All パラメーターを使用して、Get-Date のすべてのコマンドを取得します。

          PS C:\> Get-Command Get-Date -All

          CommandType     Name                                               ModuleName
          -----------     ----                                               ----------
          Function        get-date
          Cmdlet          Get-Date                                           Microsoft.PowerShell.Utility

隠れているコマンドの実行

同じ名前を持つ可能性があるその他のコマンドからコマンドを識別する項目のプロパティを指定することによって、特定のコマンドを実行できます。

この方法を使用して任意のコマンドを実行できますが、隠れているコマンドを実行する場合に特に役立ちます。

スクリプトを実行するセッション内にどのコマンドが存在する可能性があるかを予測することはできないので、配布を意図したスクリプトを記述する場合は、ベスト プラクティスとしてこの方法を使用します。

修飾名

元のモジュールまたはスナップインの名前を使用してコマンド名を修飾することにより、Windows PowerShell スナップインやモジュール、または別のセッションからインポートされたコマンドを実行できます。

コマンドを修飾することできますが、変数またはエイリアスを修飾することはできません。

たとえば、Microsoft.PowerShell.Utility スナップインの Get-Date コマンドレットが同じ名前を持つエイリアス、関数、またはコマンドレットによって隠れている場合、コマンドレットのスナップイン修飾名を使用して実行できます。

          Microsoft.PowerShell.Utility\Get-Date

MapFunctions モジュールによって追加された New-Map コマンドを実行するには、そのモジュール修飾名を使用します。

          MapFunctions\New-Map

コマンドのインポート元となるスナップインまたはモジュールを検索するには、コマンドの ModuleName プロパティを使用します。

          (Get-Command <command-name>).ModuleName

たとえば、Get-Date コマンドレットのソースを検索するには、次のように入力します。

          PS C:\>(Get-Command Get-Date).ModuleName
          Microsoft.PowerShell.Utility

Call 演算子

Get-ChildItem (エイリアスは「dir」)、Get-Command、または Get-Module Call コマンドを使用して取得可能な任意のコマンドを実行するために Call 演算子 (&) を使用することもできます。

コマンドを実行するには、Get-Command コマンドをかっこで囲み、Call 演算子 (&) を使用してコマンドを実行します。

          &(Get-Command ...)  

      - or -

          &(dir ... )

たとえば、Map という名前のエイリアスによって隠れている Map という名前の関数がある場合、次のコマンドを使用して関数を実行します。

          &(Get-Command -Name Map -Type function)  

      - or -

          &(dir function:\map)

隠れているコマンドを変数に保存して、実行を容易にすることもできます。

たとえば、次のコマンドは Map 関数を $myMap 変数に保存し、Call 演算子を使用して実行します。

          $myMap = (Get-Command -Name map -Type function)

          &($myMap)

モジュールで生成されたコマンドの場合は、次の形式を使用して実行できます。

         & <PSModuleInfo-object> <command>

たとえば、FileCommands モジュール内の Add-File コマンドレットを実行するには、次のコマンド シーケンスを使用します。

         $FileCommands = get-module -name FileCommands
           
         & $FileCommands Add-File

置換される項目

セッションで作成するかプロファイルを使用して追加する関数、変数、およびエイリアスなど、モジュールまたはスナップインからインポートされていない項目は、同じ名前を持つコマンドで置き換えられる場合があります。置き換えられた場合、アクセスすることはできません。

変数および別名は、呼び出し演算子または修飾名を使用して実行できないので、モジュールまたはスナップインからインポートされた場合であっても常に置き換えられます。

たとえば、セッションで Get-Map 関数を入力し、Get-Map という関数をインポートする場合、元の関数は置き換えられます。現在のセッションでそれを取得することはできません。

名前競合の回避

コマンド名の競合を管理する最善の方法はそれらを防ぐことです。コマンドに名前を付ける場合は、非常に具体的であるか、または独自性の高い名前を使用します。たとえば、コマンドの名詞にご自身の頭文字や会社名の頭字語を追加します。

また、Windows PowerShell モジュールまたは別のセッションから現在のセッションにコマンドをインポートする場合、Import-Module または Import-PSSession コマンドレットの Prefix パラメーターを使用して、コマンド名の名詞にプレフィックスを追加します。

たとえば、次のコマンドは、DateFunctions モジュールをインポートする場合に、Windows PowerShell に付属する Get-Date および Set-Date コマンドレットとの競合を回避します。

          Import-Module -Name DateFunctions -Prefix ZZ

詳細については、Import-Module および Import-PSSession を参照してください。

関連項目

about_Path_Syntax

about_Aliases

about_Functions

エイリアス (プロバイダー)

関数 (プロバイダー)

Get-Command

Import-Module

Import-PSSession