PowerShell 模块创作注意事项

本文档包括关于如何创作模块以获得最佳性能的一些准则。

模块清单创作

不使用以下准则的模块清单可能会对常规 PowerShell 性能产生显著影响,即使该模块未在会话中使用也是如此。

命令自动发现会分析每个模块,以确定模块导出的命令,此分析的成本可能很高。 模块分析的结果按用户进行缓存,但首次运行时不能使用缓存,这是容器的典型情况。 在模块分析过程中,如果可以通过清单完全确定导出的命令,则可以避免更昂贵的模块分析。

指南

  • 在模块清单中,不要在 AliasesToExportCmdletsToExportFunctionsToExport 条目中使用通配符。

  • 如果该模块未导出特定类型的命令,则通过指定 @() 来在清单中显式指定此项。 缺少此项或 $null 条目等效于指定通配符 *

应尽量避免以下情况:

@{
    FunctionsToExport = '*'

    # Also avoid omitting an entry, it's equivalent to using a wildcard
    # CmdletsToExport = '*'
    # AliasesToExport = '*'
}

请改用:

@{
    FunctionsToExport = 'Format-Hex', 'Format-Octal'
    CmdletsToExport = @()  # Specify an empty array, not $null
    AliasesToExport = @()  # Also ensure all three entries are present
}

避免使用 CDXML

决定实现模块的方式时,主要有三个选项:

  • 二进制(通常是 C#)
  • 脚本 (PowerShell)
  • CDXML(XML 文件包装 CIM)

如果加载模块的速度非常重要,则 CDXML 的速度大致低于二进制模块。

二进制模块的加载速度最快,因为它是提前编译的,并且可以使用 NGen 对每台计算机进行 JIT 编译。

脚本模块的加载速度通常略慢于二进制模块,因为在编译和执行脚本之前,PowerShell 必须先对其进行分析。

CDXML 模块的速度通常比脚本模块慢很多,因为它必须首先分析 XML 文件,该文件随后会生成相当多需要稍后进行分析和编译的 PowerShell 脚本。