簡短描述
說明如何安裝、匯入及使用PowerShell模組。
完整描述
PowerShell 是一種腳本語言和命令shell。 該語言由 關鍵字和命令組成,關鍵字提供處理的結構和邏輯,以及執行工作的命令。 PowerShell 中的命令會實作為腳本、函式或 Cmdlet。
模組是一個自包含的可重用單元,可以包含 cmdlet、提供程式、函數、變數和可以作為單個單元導入的其他類型的資源。
PowerShell 附帶一組基本模組。 您還可以根據需要安裝更多模組。 默認情況下,首次使用模組中的命令時,會自動載入已安裝的模組。 使用該 $PSModuleAutoloadingPreference 變數來啟用、禁用和配置模組的自動載入。 如需詳細資訊,請參閱 about_Preference_Variables。
您可以在工作階段期間卸載或重新載入。
Remove-Module使用 cmdlet 從會話中卸載模組。
Import-Module使用 cmdlet 載入模組。
模組可以創建為用 C# 編寫的已編譯 .NET 程式集,也可以創建用 PowerShell 編寫的基於腳本的模組。 本主題介紹如何使用PowerShell模組。 有關如何編寫 PowerShell 模組的資訊,請參閱 編寫 PowerShell 模組。
備註
在 PowerShell 3.0 之前,Cmdlet 和提供者會封裝在 PowerShell 嵌入式管理單元中。從 PowerShell 3.0 開始,預設會將 Microsoft.PowerShell.Core 嵌入式管理單元新增至每個會話。 這是 PowerShell 中唯一剩餘的擴充模組。 所有其他嵌入式管理單元都已轉換成模組。 不再支援建立新的嵌入式管理單元。
安裝已發佈的模組
已發佈的模組是可從已註冊的存儲庫(如 PowerShell 庫)獲取的模組。 PowerShellGet 和 Microsoft.PowerShell.PSResourceGet 模組會提供 Cmdlet 來尋找、安裝 PowerShell 模組,以及將 PowerShell 模組發佈至已註冊的存放庫。
PowerShell 5.0 和更新版本隨附 PowerShellGet 模組。
Microsoft.PowerShell.PSResourceGet 模組包含在 PowerShell 7.4 及更高版本中。
Microsoft.PowerShell.PSResourceGet 是 PowerShell 的新首選包管理器,可以安裝在以前版本的 PowerShell 上。 使用 Install-Module 或 Install-PSResource Cmdlet,從 PowerShell 資源庫安裝模組。
Get-Command Install-Module, Install-PSResource
CommandType Name Version Source
----------- ---- ------- ------
Function Install-Module 2.9.0 PowerShellGet
Cmdlet Install-PSResource 1.0.0 Microsoft.PowerShell.PSResourceGet
如需詳細資訊,請參閱 PowerShellGet 概觀。
手動安裝模組
如果您以資料夾的形式接收模組,其中包含檔,則需要先將其安裝在您的電腦上,然後才能在PowerShell中使用它。
PowerShell 附帶了幾個預安裝的模組。 在基於 Windows 的電腦上,許多 Windows 功能都包含用於管理該功能的模組。 這些模組在安裝功能時安裝。 其他模組可能來自安裝模組的安裝程式或安裝程式中。
根據預設,目前使用者的 Modules 資料夾不存在。 如果您使用 CurrentUser 或 Install-Module在 Install-PSResource 範圍中安裝模組,這些 Cmdlet 會為目前使用者建立 Modules 資料夾。 如果資料夾不存在,您可以手動建立它。
使用下列命令為目前使用者建立 Modules 資料夾:
$folder = New-Item -Type Directory -Path $HOME\Documents\PowerShell\Modules
將整個模組資料夾複製到新創建的資料夾中。 在 PowerShell 中,使用 Copy-Item Cmdlet。 例如,運行以下命令將 MyModule 資料夾從 C:\PSTest 複製到您剛剛建立的資料夾:
Copy-Item -Path C:\PSTest\MyModule -Destination $folder
您可以在任何位置安裝模組,但將模組安裝在預設模組位置可讓模組更容易管理。 如需預設模組位置的詳細資訊,請參閱 about_PSModulePath。
模組自動載入
第一次從已安裝的模組執行命令時,PowerShell 會自動匯入該模組。 模組必須儲存在 $env:PSModulePath 環境變數中指定的位置。 其他位置的模組必須使用 cmdlet 導入 Import-Module 。
模組自動載入可讓您在模組中使用命令,而不需要任何設定或設定檔組態。 將模組安裝到計算機上后,無需管理模組。
以下每個示例都會導致將包含Get-CimInstance的 CimCmdlets 模組導入到工作階段中。
執行命令
Get-CimInstance Win32_OperatingSystem取得指令
Get-Command Get-CimInstance取得命令的幫助
Get-Help Get-CimInstance
您可以使用 Get-Command cmdlet 列出所有已安裝模組中的命令,即使它們尚未在工作階段中。 當您搭配通配符 (Get-Command) 使用 * 時,PowerShell 不會匯入任何模組。 您可以使用通配符進行命令發現,而無需載入會話中可能不需要的模組。
此外,使用 PowerShell 提供者的命令不會自動匯入模組。 例如,如果您使用需要 WSMan: 磁碟驅動器的命令,例如 Get-PSSessionConfiguration Cmdlet,您可能需要執行 Import-Module Cmdlet 來匯入包含 磁碟驅動器的 WSMan: 模組。
手動匯入模組
當模組未安裝在 $env:PSModulePath 環境變數所指定的位置,或當模組以獨立 .dll 或 .psm1 檔案的形式提供時,而不是封裝的模組時,則需要手動匯入模組。
您也可以變更在使用過程中匯入模組的方式。 例如, 的 Import-Module 參數會將獨特的前置詞新增至從模組匯入之 Cmdlet 的名詞部分。
NoClobber 參數會防止模組新增會隱藏或取代作業階段中現有命令的命令。 如需詳細資訊,請參閱 管理名稱衝突。
您可以通過指定模組名稱來匯入安裝在 中的 $env:PSModulePath 模組。 例如,以下命令將 BitsTransfer 模組導入到當前工作階段中。
Import-Module BitsTransfer
若要匯入不在 $env:PSModulePath中的模組,請使用模組資料夾的完整路徑。 例如,若要將 目錄中的 C:\ps-test 模組新增至您的工作階段,請輸入:
Import-Module C:\ps-test\TestCmdlets
若要匯入模組資料夾中未包含的模組檔案,請使用命令中模組檔案的完整路徑。 例如,若要將 C:\ps-test 目錄中的 TestCmdlets.dll 模組新增至您的工作階段,請輸入:
Import-Module C:\ps-test\TestCmdlets.dll
如需瞭解將模組新增到工作階段的詳細資訊,請參閱 Import-Module。
在每個工作階段開始時匯入模組
Import-Module 命令會將模組匯入您目前的 PowerShell 工作階段。 若要將模組匯入您啟動的每個 PowerShell 工作階段,請將 Import-Module 命令新增至 PowerShell 配置檔。
如需了解關於設定檔的更多資訊,請參閱 about_Profiles。
尋找已安裝的模組
該 Get-Module cmdlet 獲取已在會話中導入的 PowerShell 模組。
Get-Module
列出的模組可以包含從任何位置匯入的模組,而不只是從 $env:PSModulePath。
使用下列命令來列出安裝在 $env:PSModulePath中的模組:
Get-Module -ListAvailable
此命令會取得安裝在 $env:PSModulePath中的所有模組,而不只是匯入目前會話的模組。 此命令不會列出安裝在其他位置的模組。
如需詳細資訊,請參閱 Get-Module。
列出模組中的命令
使用 Get-Command Cmdlet 來尋找所有可用的命令。 您可以使用 Get-Command Cmdlet 的參數,依模組、名稱和名詞來篩選命令。
若要尋找模組中的所有命令,請輸入:
Get-Command -Module <module-name>
例如,若要在 BitsTransfer 模組中尋找命令,請輸入:
Get-Command -Module BitsTransfer
如需 Get-Command Cmdlet 的詳細資訊,請參閱 Get-Command。
拿掉模組
當您移除模組時,模組新增的命令會從會話中刪除。 例如,下列命令會從目前的會話中移除 BitsTransfer 模組。
Remove-Module BitsTransfer
拿掉模組會反轉匯入模組的作業。 拿掉模組並不會卸載模組。 如需詳細資訊,請參閱 Remove-Module。
您可以從模組和附加元件將命令新增至您的工作階段。模組可以新增所有類型的命令,包括 Cmdlet、提供者和函式,以及變數、別名和 PowerShell 磁碟驅動器等項目。 嵌入式管理單元只能新增 Cmdlet 和提供者。
在從會話中移除模組之前,請使用下列命令來判斷您要移除的模組。
例如,使用下列命令來尋找 Get-Date 和 Get-Help Cmdlet 的來源:
Get-Command Get-Date, Get-Help -All |
Select-Object -Property Name, CommandType, Module ,PSSnapIn
下列輸出顯示 Get-Help Cmdlet 位於 Microsoft.PowerShell.Core 嵌入式管理單元中。 無法從會話中移除此插件。
Name CommandType Module PSSnapIn
---- ----------- ------ --------
Get-Date Function
Get-Date Cmdlet Microsoft.PowerShell.Utility
Get-Help Cmdlet Microsoft.PowerShell.Core
Get-Date有兩個來源。 其中一個是函式,另一個是 Microsoft.PowerShell.Utility 模組中的 Cmdlet。 您可以使用 Remove-Module移除模組。 若要移除函式,您可以從 Function: 磁碟驅動器中刪除它。
Remove-Item Function:Get-Date
如需 Function: 磁碟驅動器的詳細資訊,請參閱 about_Function_Provider。
管理名稱衝突
當工作階段中的多個命令具有相同名稱時,就會發生名稱衝突。 當模組中的命令與會話中的命令或專案名稱相同時,匯入模組會導致名稱衝突。
Import-Module 可能會新增命令,以隱藏和取代目前會話中的命令。 名稱衝突可能會導致命令隱藏或取代。 當匯入的模組包含與會話中現有命令同名的命令時,就會發生命令取代。 新導入的命令 replace 優先於現有命令。
例如,當會話包含函式和具有相同名稱的 Cmdlet 時,PowerShell 預設會執行函式。 當會話包含具有相同名稱之相同類型的命令時,預設會執行最近新增的命令,例如具有相同名稱的兩個 Cmdlet。
如需詳細資訊,包括優先順序規則的說明,以及執行隱藏命令的指示,請參閱 about_Command_Precedence。
您可以執行已被隱藏或取代為限定命令名稱的命令。 要限定命令名稱,請添加 name of module than 包含所需命令的版本。 例如:
Microsoft.PowerShell.Utility\Get-Date
使用模組名稱前置詞執行 Get-Date 可確保從 Microsoft.PowerShell.Utility 模組執行版本。
若要偵測名稱衝突,請使用 Cmdlet 的 Get-Command 參數。 根據預設,Get-Command 只會取得當您輸入命令名稱時執行的命令。
All 參數會取得工作階段中具有特定名稱的所有命令。
若要防止名稱衝突,請使用 NoClobber 或 PrefixImport-Module Cmdlet 的參數。
Prefix 參數會將前置詞新增至匯入命令的名稱,使其在會話中是唯一的。
NoClobber 參數不會匯入任何在工作階段中隱藏或取代現有命令的命令。
您也可以使用 Alias、Cmdlet、Function和 Import-Module 參數,只選取您想要匯入的命令,而且您可以排除在會話中造成名稱衝突的命令。
模組作者可以使用模組指令清單的 DefaultCommandPrefix 屬性,將預設前置詞新增至所有命令名稱,以防止名稱衝突。 Prefix 參數的值優先於 DefaultCommandPrefix的值。