系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

把函数、类、资源和命令打包成可发现、可版本管理的模块

适用场景

当一组函数会被多个脚本复用、需要版本控制、需要分发到不同机器,或要安装第三方能力(如 Az、Pester)时,用模块而不是复制 .ps1 文件。排查“命令为什么找不到、加载的是哪个版本、为什么和文档不一致”也依赖模块知识。

一次性脚本不需要模块化;把几十行函数硬做成模块只会增加清单和发布成本。模块适合有稳定接口、需要长期维护的逻辑。

核心概念

5.1 与 7.x 差异

常用操作

# 1. 看清模块搜索路径和顺序,Windows 用分号分隔,Linux/macOS 用冒号
PS C:\> $env:PSModulePath -split [IO.Path]::PathSeparator

# 2. 列出已安装模块及版本,排查“装了但加载错版本”
PS C:\> Get-Module -ListAvailable | Sort-Object Name, Version | Select-Object Name, Version, Path
PS C:\> Get-Module -ListAvailable Pester

# 3. 显式导入清单并查看它导出了什么
PS C:\> Import-Module .\MyModule.psd1 -Force -Verbose
PS C:\> Get-Command -Module MyModule

# 4. 不写 Import-Module 也能调用,首次调用会从 PSModulePath 自动加载
PS C:\> Get-Widget -Name api
PS C:\> Get-Module MyModule

# 5. 在脚本头部声明依赖,缺模块或版本不够时不继续执行
#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0.0' }

# 6. 查找、安装到当前用户、离线保存(5.1 的 PowerShellGet 写法)
PS C:\> Find-Module -Name Pester
PS C:\> Install-Module -Name Pester -Scope CurrentUser -MinimumVersion 5.0
PS C:\> Save-Module -Name Pester -Path C:\offline\modules

# 7. PowerShell 7.4+ 用 PSResourceGet,参数更清晰
PS C:\> Install-PSResource -Name Pester -Scope CurrentUser

# 8. 脚本模块的最小导出示例
# MyModule.psm1
function Get-Widget { param([string] $Name) [pscustomobject]@{ Name = $Name } }
Export-ModuleMember -Function Get-Widget

易错点

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 一条命令能正常运行,但 Get-Module 里一开始看不到对应模块,为什么?
  2. 同一模块装了 1.2 和 2.0 两个版本,怎样确保脚本加载 1.2?
  3. 为什么脚本模块里的类,调用方用 Import-Module 后仍然报“找不到类型”?
答案
  1. PowerShell 在首次调用命令时会从 PSModulePath 自动加载模块,所以调用成功后 Get-Module 才能看到它;这不代表模块此前已被显式导入。
  2. 用 Import-Module MyModule -RequiredVersion 1.2.0 精确加载,并在脚本里用 #Requires -Modules 声明版本要求;同时确认 PSModulePath 中没有更高优先级的同名模块。
  3. PowerShell 类在解析阶段就需要类型可见,Import-Module 发生在运行时;要在脚本或模块顶部使用 using module,并确保清单正确导出该模块。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令