about_Modules

簡短描述

說明如何安裝、匯入及使用PowerShell模組。

詳細描述

PowerShell 是腳本語言和命令殼層。 語言是由 關鍵詞所組成,可提供處理的結構和邏輯,以及執行工作的命令。 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 模組發佈至已註冊的存放庫。

PowerShellGet 模組隨附於 PowerShell 5.0 和更新版本。 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 目前用戶的資料夾不存在。 如果您使用 或 Install-PSResource在範圍Install-ModuleCurrentUser安裝模組,這些 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

模組自動載入可讓您在模組中使用命令,而不需要任何設定或設定檔組態。 在計算機上安裝模塊之後,不需要管理模組。

下列每個範例都會讓 包含的 CimCmdlets 模組 Get-CimInstance匯入您的工作階段。

  • 執行命令

    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: Microsoft.WSMan.Management 模組。

手動匯入模組

當模組未安裝在環境變數所指定 $env:PSModulePath 的位置,或當模組以獨立 .dll.psm1 檔案的形式提供,而不是封裝的模組時,需要手動匯入模組。

您也可以變更在工作階段中匯入模組的方式。 例如,的 Import-Module Prefix 參數會將獨特的前置詞新增至從模組匯入之 Cmdlet 的名詞部分。 NoClobber 參數會防止模組新增命令,以隱藏或取代會話中的現有命令。 如需詳細資訊,請參閱 管理名稱衝突

您可以藉由指定模組名稱來匯入已安裝的 $env:PSModulePath 模組。 例如,下列命令會將 BitsTransfer 模組匯入目前的工作階段。

Import-Module BitsTransfer

若要匯入不在 中的 $env:PSModulePath模組,請使用模組資料夾的完整路徑。 例如,若要將目錄中的 C:\ps-test TestCmdlets 模組新增至您的工作階段,請輸入:

Import-Module C:\ps-test\TestCmdlets

若要匯入模組資料夾中未包含的模組檔案,請使用命令中模組檔案的完整路徑。 例如,若要將目錄中的 TestCmdlets.dll 模組 C:\ps-test 新增至您的工作階段,請輸入:

Import-Module C:\ps-test\TestCmdlets.dll

如需將模組新增至會話的詳細資訊,請參閱 Import-Module

在每個工作階段開始時匯入模組

Import-Module命令會將模組匯入您目前的PowerShell工作階段。 若要將模組匯入您啟動的每個 PowerShell 工作階段,請將 命令新增 Import-Module 至 PowerShell 配置檔。

如需配置檔的詳細資訊,請參閱 about_Profiles

尋找已安裝的模組

Cmdlet Get-Module 會取得已在會話中匯入的 PowerShell 模組。

Get-Module

列出的模組可以包含從任何位置匯入的模組,而不只是從 $env:PSModulePath

使用下列命令來列出 中 $env:PSModulePath安裝的模組:

Get-Module -ListAvailable

此命令會取得中 $env:PSModulePath安裝的所有模組,而不只是匯入目前會話的模組。 此命令不會列出安裝在其他位置的模組。

如需詳細資訊,請參閱 Get-Module

列出模組中的命令

Get-Command使用 Cmdlet 來尋找所有可用的命令。 您可以使用 Cmdlet 的參數 Get-Command 來篩選命令,例如依模組、名稱和名詞。

若要尋找模組中的所有命令,請輸入:

Get-Command -Module <module-name>

例如,若要在 BitsTransfer 模組中尋找命令,請輸入:

Get-Command -Module BitsTransfer

如需 Cmdlet 的詳細資訊 Get-Command ,請參閱 Get-Command

拿掉模組

當您移除模組時,模組新增的命令會從會話中刪除。 例如,下列命令會 從目前的會話中移除 BitsTransfer 模組。

Remove-Module BitsTransfer

拿掉模組會反轉匯入模組的作業。 拿掉模組並不會卸載模組。 如需詳細資訊,請參閱 Remove-Module

您可以從模組和嵌入式管理單元將命令新增至您的工作階段。模組可以新增所有類型的命令,包括 Cmdlet、提供者和函式,以及變數、別名和 PowerShell 磁碟驅動器等專案。 嵌入式管理單元只能新增 Cmdlet 和提供者。

在從會話中移除模組之前,請使用下列命令來判斷您要移除的模組。

例如,使用下列命令來尋找 和 Get-Help Cmdlet 的來源Get-Date

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 可能會新增命令,以隱藏和取代目前會話中的命令。 名稱衝突可能會導致命令隱藏或取代。 當匯入的模組包含與會話中現有命令同名的命令時,就會發生命令取代。 新匯入的命令會優先於現有的命令。

例如,當會話包含函式和具有相同名稱的 Cmdlet 時,PowerShell 預設會執行函式。 當會話包含具有相同名稱之相同類型的命令時,預設會執行最近新增的命令,例如具有相同名稱的兩個 Cmdlet。

如需詳細資訊,包括優先順序規則的說明,以及執行隱藏命令的指示,請參閱 about_Command_Precedence

您可以執行已隱藏或取代為限定命令名稱的命令。 若要限定命令名稱,請新增模組的名稱,而不是包含您想要的命令版本。 例如:

Microsoft.PowerShell.Utility\Get-Date

使用模組名稱前置詞執行 Get-Date 可確保從 Microsoft.PowerShell.Utility 模組執行版本。

若要偵測名稱衝突,請使用 Cmdlet 的 Get-Command All 參數。 根據預設, Get-Command 只會取得當您輸入命令名稱時所執行的命令。 All 參數會取得會話中具有特定名稱的所有命令。

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

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

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

另請參閱