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