關於_模組

簡短描述

說明如何安裝、匯入及使用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的值。

另請參閱