about_Command_Precedence
主題
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:path) 中,或您已指定指令碼檔的路徑。
若要執行目前目錄中的指令碼,請指定完整路徑或輸入點 (.) 代表目前目錄。
例如,若要執行目前目錄中的 FindDocs.ps1 檔案,請輸入:
.\FindDocs.ps1
-- 如果未指定路徑,Windows PowerShell 會在執行命令時採用下列優先順序:
1. 別名
2. 函數
3. Cmdlet
4. 原生 Windows 命令
因此如果輸入 "help",Windows PowerShell 會先尋找名稱為 "help" 的別
名,然後尋找名稱為 "help" 的函數,再尋找名稱為 "Help" 的 Cmdlet。
Windows PowerShell 會執行第一個找到的 "help" 項目。
例如,假設您有名稱為 Get-Map 的函數。然後您新增或匯入名稱為 Get-Map
的 Cmdlet。
根據預設,當您輸入 "Get-Map" 後,Windows PowerShell 會執行函數。
-- 當工作階段中同類型的項目同名時 (例如兩個 Cmdlet 同名),
Windows PowerShell 會執行最近新增至工作階段的項目。
例如,假設您有名稱為 Get-Date 的 cmdlet。然後您匯入另一個名稱為
Get-Date 的 cmdlet。根據預設,當您輸入 "Get-Date" 後,
Windows PowerShell 會執行最後匯入的 Cmdlet。
隱藏和取代項目
由於這些規則,項目可由同名的項目所取代或隱藏。
-- 如果您仍然可以存取原始項目 (例如透過以模組和嵌入式管理單元名稱限定
項目名稱的方式),項目便是「被隱藏」或「被遮蔽」。
例如,如果匯入與工作階段中的 Cmdlet 同名的函數,該 Cmdlet 會被隱藏
(但不會被取代),因為它是從嵌入式管理單元或模組匯入的。
-- 如果您無法再存取原始項目,項目便是「被取代」或「被覆寫」。
例如,如果匯入與工作階段中的變數同名的變數,原始變數會被取代而且無法
再存取。
您無法以模組名稱來限定變數。
此外,如果在命令列輸入一個函數,然後匯入同名的函數,原始函數會被取
代,而且無法再存取。
執行隱藏的命令
您可以指定項目屬性來區分可能同名的命令,藉此執行特定命令。
這個方法可用來執行任何命令,但特別適合於執行隱藏的命令。
當您撰寫想要散發的指令碼時,請將這個方法當成最佳作法,因為您無法預測哪些
命令可能存在於指令碼執行所在的工作階段中。
限定名稱
您可以透過以命令之來源模組或嵌入式管理單元的名稱來限定命令名稱,執行已經
從 Windows PowerShell 嵌入式管理單元或模組匯入的命令。
您可以限定命令,但無法限定變數或別名。
例如,如果同名的別名、函數或 Cmdlet 隱藏來自 Microsoft.PowerShell.Utility
嵌入式管理單元的 Get-Date Cmdlet,您可以使用這個 Cmdlet 的嵌入式管理單元
的限定名稱加以執行:
Microsoft.PowerShell.Utility\Get-Date
若要執行 MapFunctions 模組所新增的 New-Map 命令,請使用其模組的限定名稱:
MapFunctions\New-Map
若要尋找命令匯入的來源嵌入式管理單元或模組,請使用下列 Get-Command 命令
格式:
get-command <命令名稱> | format-list -property Name, PSSnapin, Module
例如,若要尋找 Get-Date Cmdlet 的來源,請輸入:
get-command get-date | format-list -property Name, PSSnapin, Module
Name : Get-Date
PSSnapIn : Microsoft.PowerShell.Utility
Module :
呼叫運算子
您也可以使用呼叫運算子 (&) 執行任何能透過 Get-ChildItem (別名為 "dir")、
Get-Command 或 Get-Module 命令取得的命令。
若要執行命令,請將 Get-Command 命令放在括號內,並使用呼叫運算子 (&) 執行
命令。
&(get-command ...)
- 或 -
&(dir ...)
例如,如果您有一個由 Map 別名隱藏的 Map 函數,請使用下列命令執行這個函數。
&(get-command -name map -type function)
- 或 -
&(dir function:\map)
您也可以將隱藏的命令儲存到變數,使其更容易執行。
例如,下列命令會將 Map 函數儲存到 $myMap 變數,然後使用呼叫運算子加以
執行。
$myMap = (get-command -name map -type function)
&($myMap)
如果命令的來源是模組,您可以使用下列格式加以執行:
& <PSModuleInfo 物件> <命令>
例如,若要執行 FileCommands 模組中的 Add-File Cmdlet,請採用下列命令順序。
$FileCommands = get-module -name FileCommands
& $FileCommands Add-File
取代項目
您在工作階段中建立或是使用設定檔新增的項目 (例如函數、變數和別名),其匯入
來源不是模組或嵌入式管理單元的話,便可由同名的命令所取代。如果項目被取
代,您就無法加以存取。
變數或別名一定會被取代,即使已經從模組或嵌入式管理單元匯入也一樣,因為您
無法使用呼叫運算子或限定名稱執行它們。
例如,如果您在工作階段中輸入 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
Alias (提供者)
Function (提供者)
Get-Command
Import-Module
Import-PSSession