共用方式為


關於_模組

簡短描述

說明如何安裝、匯入及使用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 庫)獲取的模組。 PowerShellGetMicrosoft.PowerShell.PSResourceGet 模組會提供 Cmdlet 來尋找、安裝 PowerShell 模組,以及將 PowerShell 模組發佈至已註冊的存放庫。

PowerShell 5.0 和更新版本隨附 PowerShellGet 模組。 Microsoft.PowerShell.PSResourceGet 模組包含在 PowerShell 7.4 及更高版本中。 Microsoft.PowerShell.PSResourceGet 是 PowerShell 的新首選包管理器,可以安裝在以前版本的 PowerShell 上。 使用 Install-ModuleInstall-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 資料夾不存在。 如果您使用 CurrentUserInstall-ModuleInstall-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-CimInstanceCimCmdlets 模組導入到工作階段中。

  • 執行命令

    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-DateGet-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 參數會取得工作階段中具有特定名稱的所有命令。

若要防止名稱衝突,請使用 NoClobberPrefixImport-Module Cmdlet 的參數。 Prefix 參數會將前置詞新增至匯入命令的名稱,使其在會話中是唯一的。 NoClobber 參數不會匯入任何在工作階段中隱藏或取代現有命令的命令。

您也可以使用 AliasCmdletFunctionImport-Module 參數,只選取您想要匯入的命令,而且您可以排除在會話中造成名稱衝突的命令。

模組作者可以使用模組指令清單的 DefaultCommandPrefix 屬性,將預設前置詞新增至所有命令名稱,以防止名稱衝突。 Prefix 參數的值優先於 DefaultCommandPrefix的值。

另請參閱