共用方式為


about_Command_Precedence

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0

在此插入簡介。

主題

about_Command_Precedence

簡短描述

描述 Windows PowerShell® 如何判斷要執行哪個命令。

詳細描述

本主題說明 Windows PowerShell 如何判斷要執行哪個命令,特別是當工作階段包含一個以上具有相同名稱的命令時。另外也會說明如何執行預設不執行的命令,並說明如何在您的工作階段中避免命令名稱衝突。

命令優先順序

當工作階段包含具有相同名稱的命令時,Windows PowerShell 會使用下列規則來決定要執行哪個命令。

當您從模組、嵌入式管理單元和其他工作階段將命令新增至工作階段時,這些規則就變得非常重要。

-- 如果您指定命令的路徑,Windows PowerShell 就會在路徑指定的位置執行命令。

例如,下列命令會在 C:\TechDocs 目錄中執行 FindDocs.ps1 指令碼。

             C:\TechDocs\FindDocs.ps1

做為一個安全性功能,Windows PowerShell 並不會執行可執行檔 (原生) 命令,包括 Windows PowerShell 指令碼,除非命令位於 Path 環境變數 ($env: 路徑) 中列出的路徑,或是您指定指令碼檔案的路徑。

若要執行目前目錄中的指令碼,請指定完整路徑,或輸入一個點 (.) 來代表目前的目錄。

例如,若要在目前的目錄中執行 FindDocs.ps1 檔案,請輸入:

             .\FindDocs.ps1

-- 如果您未指定路徑,Windows PowerShell 在執行命令時,就會使用下列優先順序:

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

因此,如果您輸入 "help",Windows PowerShell 就會先尋找名為 "help" 的別名,然後尋找名為 "Help" 的函式,最後尋找名為 "Help" 的 Cmdlet。它會執行所找到的第一個 "help" 項目。

例如,如果您的工作階段中有 Get-Map 函式,而您匯入 Get-Map 的 Cmdlet。根據預設,當您輸入 "Get-Map" 時,Windows PowerShell 會執行 Get-Map 函式。

-- 當工作階段包含具有相同名稱的相同類型項目時,例如兩個相同名稱的 Cmdlet,則 Windows PowerShell 會執行最近新增至工作階段的項目。

例如,如果您有名為 Get-Date 的 Cmdlet,並匯入另一個名為 Get-Date 的 Cmdlet,根據預設,當您輸入 "Get-Date" 時,Windows PowerShell 會執行最近匯入的 Cmdlet。

隱藏和取代的項目

根據這些規則的結果,項目會被具有相同名稱的項目取代或隱藏。

-- 如果您仍可存取原始項目 (例如使用模組或嵌入式管理單元名稱來限定項目名稱),則會將項目「隱藏」或「加上陰影」。

例如,如果您匯入的函式與工作階段中的 Cmdlet 同名,則會隱藏 (但不會取代) Cmdlet,因為它是從嵌入式管理單元或模組匯入的。

-- 如果您已無法存取原始項目,則會「取代」或「覆寫」項目。

例如,如果您匯入的變數與工作階段中的變數同名,則會取代原始變數,且無法再加以存取。您無法使用模組名稱來限定變數。

此外,如果您在命令列中輸入函式,然後匯入相同名稱的函式,則會取代原始函式,且無法再加以存取。

尋找隱藏的命令

Get-Command Cmdlet 的 All 參數會取得具有指定名稱的所有命令,即使已被隱藏或取代都一樣。從 Windows PowerShell 3.0 開始,Get-Command 預設只會取得您輸入命令名稱時所執行的命令。

在下列範例中,工作階段包含 Get-Date 函式和 Get-Date Cmdlet。

下列命令會取得當您輸入 "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 嵌入式管理單元的 Cmdlet,被相同名稱的別名、函數或 Cmdlet 隱藏,您可以使用 Cmdlet 的嵌入式管理單元限定名稱來加以執行:

          Microsoft.PowerShell.Utility\Get-Date

若要執行 MapFunctions 模組新增的 New-Map 命令,請使用其模組限定名稱:

          MapFunctions\New-Map

若要尋找匯入命令的來源嵌入式管理單元或模組,請使用命令的 ModuleName 屬性。

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

例如,若要尋找 Get-Date Cmdlet 的來源,請輸入:

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

呼叫運算子

您也可以使用 Call 運算子 (&) 來執行可以使用 Get-ChildItem (別名為 "dir")、Get-Command 或 Get-Module 命令來取得的任何命令。

若要執行命令,請以括弧括住 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 Cmdlet,請使用下列命令順序。

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

取代的項目

尚未從模組或嵌入式管理單元匯入的項目 (例如您在工作階段中建立的函式、變數和別名),或是您使用設定檔來新增的項目,會被具有相同名稱的命令所取代。如果這些項目被取代,您就無法加以存取。

即使變數和別名是從模組或嵌入式管理單元匯入的,還是會被取代,因為您無法使用 Call 運算子或限定名稱來加以執行。

例如,如果您在工作階段中輸入 Get-Map 函式,並匯入名為 Get-Map 的函式,就會取代原始函式。您無法在目前的工作階段中擷取原始函式。

避免名稱衝突

管理命令名稱衝突的最佳方式,就是防止衝突。當您在為命令命名時,請使用非常特別或可能是唯一的名稱。例如,在命令的名詞中加入您的姓名首字母或公司名稱縮寫。

此外,當您從 Windows PowerShell 模組或另一個工作階段,將命令匯入您的工作階段時,請使用 Import-Module 或 Import-PSSession Cmdlet 的 Prefix 參數,將前置詞新增至命令名稱中的名詞。

例如,下列命令可避免與您匯入 DateFunctions 模組時,隨附於 Windows PowerShell 的 Get-Date 和 Set-Date Cmdlet 發生任何衝突。

          Import-Module -Name DateFunctions -Prefix ZZ

如需詳細資訊,請參閱 Import-Module 和 Import-PSSession。

另請參閱

about_Path_Syntax

about_Aliases

about_Functions

別名 (提供者)

函式 (提供者)

Get-Command

Import-Module

Import-PSSession