了解 Windows PowerShell 模块

模块 是一组相关的 Windows PowerShell 功能,分为一个方便的单元(通常保存在单个目录中)。 通过将一组相关的脚本文件、程序集和相关资源定义为模块,可以引用、加载、持久化和共享代码比其他方式容易得多。

模块的主要用途是允许 Windows PowerShell 代码的模块化(即重用和抽象)。 例如,创建模块的最基本方法是将 Windows PowerShell 脚本另存为 .psm1 文件。 这样做可以控制脚本中包含的函数和变量(即公开或私有)。 将脚本保存为 .psm1 文件还可以控制某些变量的范围。 最后,还可以使用 cmdlet(如 Install-Module)来组织、安装和使用脚本作为大型解决方案的构建基块。

模块组件和类型

模块由四个基本组件组成:

  1. 某种代码文件 - 通常是 PowerShell 脚本或托管 cmdlet 程序集。

  2. 上述代码文件可能需要的任何其他内容,例如其他程序集、帮助文件或脚本。

  3. 描述上述文件的清单文件,以及存储元数据,如作者和版本控制信息。

  4. 包含上述所有内容的目录,位于 PowerShell 可以合理找到的位置。

    注释

    这些组件本身都不是必需的。 例如,模块在技术上只能是存储在 .psm1 文件中的脚本。 还可以有一个模块,该模块只不过是清单文件,主要用于组织目的。 还可以编写一个脚本来动态创建模块,因此实际上不需要目录来存储任何内容。 以下部分介绍可以通过混合和匹配模块的不同可能部分来获取的模块类型。

脚本模块

顾名思义,脚本模块 是包含任何有效 Windows PowerShell 代码的文件(.psm1)。 脚本开发人员和管理员可以使用此类型的模块来创建其成员包括函数、变量等的模块。 核心是一个脚本模块只是具有不同扩展的 Windows PowerShell 脚本,它允许管理员使用它上的导入、导出和管理功能。

此外,还可以使用清单文件在模块中包含其他资源,例如数据文件、其他依赖模块或运行时脚本。 清单文件还可用于跟踪元数据,例如创作和版本控制信息。

最后,脚本模块(与未动态创建的任何其他模块一样)需要保存在 PowerShell 可以合理发现的文件夹中。 通常,这在 PowerShell 模块路径上;但如有必要,可以显式描述模块的安装位置。 有关详细信息,请参阅 如何编写 PowerShell 脚本模块

二进制模块

二进制模块 是包含已编译代码的 .NET Framework 程序集(.dll),如 C# 。 Cmdlet 开发人员可以使用这种类型的模块来共享 cmdlet、提供程序等。 (现有的管理单元也可以用作二进制模块。与脚本模块相比,二进制模块允许你创建更快或使用功能(如多线程处理)的 cmdlet,这些功能在 Windows PowerShell 脚本中不太容易编码。

与脚本模块一样,可以包含清单文件来描述模块使用的其他资源,以及跟踪有关模块的元数据。 同样,你可能应在 PowerShell 模块路径的某个文件夹中安装二进制模块。 有关详细信息,请参阅如何 如何编写 PowerShell 二进制模块

清单模块

清单模块 是一个模块,它使用清单文件来描述其所有组件,但没有任何核心程序集或脚本。 (正式版,清单模块将 ModuleToProcessRootModule 清单元素留空。但是,你仍然可以使用模块的其他功能,例如能够加载依赖程序集或自动运行某些预处理脚本。 还可以将清单模块用作打包其他模块将使用的资源的便捷方法,例如嵌套模块、程序集、类型或格式。 有关详细信息,请参阅 如何编写 PowerShell 模块清单

动态模块

动态模块 是未从文件加载或保存到文件的模块。 而是使用 New-Module cmdlet 通过脚本动态创建它们。 这种类型的模块使脚本能够按需创建模块,无需加载或保存到持久性存储。 动态模块本质上是短期的,因此 Get-Module cmdlet 无法访问。 同样,它们通常不需要模块清单,也不需要永久文件夹来存储其相关程序集。

模块清单

模块清单 是包含哈希表的 .psd1 文件。 哈希表中的键和值执行以下作:

  • 描述模块的内容和属性。

  • 定义先决条件。

  • 确定组件的处理方式。

    模块不需要清单。 模块可以引用脚本文件(.ps1)、脚本模块文件(.psm1)、清单文件(.psd1)、格式化和类型文件(.ps1xml)、cmdlet 和提供程序程序集(.dll)、资源文件、帮助文件、本地化文件或作为模块一部分捆绑的任何其他类型的文件或资源。 对于国际化脚本,模块文件夹还包含一组邮件目录文件。 如果将清单文件添加到模块文件夹,可以通过引用清单将多个文件引用为单个单元。

    清单本身描述了以下类别的信息:

  • 有关模块的元数据,例如模块版本号、作者和说明。

  • 导入模块所需的先决条件,例如 Windows PowerShell 版本、公共语言运行时 (CLR) 版本和所需的模块。

  • 处理指令,例如要处理的脚本、格式和类型。

  • 对模块成员进行导出的限制,例如要导出的别名、函数、变量和 cmdlet。

    有关详细信息,请参阅 如何编写 PowerShell 模块清单

存储和安装模块

创建脚本、二进制或清单模块后,可以将工作保存到其他人可能访问它的位置。 例如,模块可以存储在安装了 Windows PowerShell 的系统文件夹中,也可以存储在用户文件夹中。

一般来说,可以使用存储在 $Env:PSModulePath 变量中的其中一个路径来确定应在何处安装模块。 使用这些路径之一意味着当用户在其代码中调用模块时,PowerShell 可以自动查找和加载模块。 如果将模块存储在其他位置,可以通过在调用 Install-Module时将模块的位置作为参数传入来显式告知 PowerShell。

不管怎样,文件夹的路径都称为模块(ModuleBase)的 ,脚本、二进制文件或清单模块文件的名称应与模块文件夹名称相同,但有以下例外:

  • 可以使用 cmdlet 的 Name 参数命名由 New-Module cmdlet 创建的动态模块。

  • Import-Module -Assembly 命令从程序集对象导入的模块按以下语法命名:"dynamic_code_module_" + assembly.GetName()

    有关详细信息,请参阅 安装 PowerShell 模块about_PSModulePath

模块 Cmdlet 和变量

以下 cmdlet 和变量由 Windows PowerShell 提供,用于创建和管理模块。

New-Module cmdlet 此 cmdlet 创建一个新的动态模块,该模块仅存在于内存中。 该模块是从脚本块创建的,并且其导出的成员(如其函数和变量)立即在会话中可用,并在会话关闭之前保持可用状态。

New-ModuleManifest cmdlet 此 cmdlet 创建新的模块清单(.psd1)文件,填充其值,并将清单文件保存到指定路径。 此 cmdlet 还可用于创建可手动填充的模块清单模板。

Import-Module cmdlet 此 cmdlet 将一个或多个模块添加到当前会话。

Get-Module cmdlet 此 cmdlet 检索有关已导入或可导入到当前会话的模块的信息。

Export-ModuleMember cmdlet 此 cmdlet 指定从脚本模块(.psm1)文件或通过使用 New-Module cmdlet 创建的动态模块(如 cmdlet、函数、变量和别名)的模块成员。

Remove-Module cmdlet 此 cmdlet 从当前会话中删除模块。

Test-ModuleManifest cmdlet 此 cmdlet 验证模块清单是否通过验证模块清单文件(.psd1)中实际存在于指定路径中来准确描述模块的组件。

$PSScriptRoot此变量包含从中执行脚本模块的目录。 它使脚本能够使用模块路径访问其他资源。

$Env:PSModulePath 此环境变量包含在其中存储 Windows PowerShell 模块的目录的列表。 Windows PowerShell 在自动导入模块和更新模块的帮助主题时使用此变量的值。

另请参阅

编写 Windows PowerShell 模块