PowerShell 模块创作注意事项
本文档包括关于如何创作模块以获得最佳性能的一些准则。
模块清单创作
不使用以下准则的模块清单可能会对常规 PowerShell 性能产生显著影响,即使该模块未在会话中使用也是如此。
命令自动发现会分析每个模块,以确定模块导出的命令,此分析的成本可能很高。 模块分析的结果按用户进行缓存,但首次运行时不能使用缓存,这是容器的典型情况。 在模块分析过程中,如果可以通过清单完全确定导出的命令,则可以避免更昂贵的模块分析。
指南
在模块清单中,不要在
AliasesToExport
、CmdletsToExport
和FunctionsToExport
条目中使用通配符。如果该模块未导出特定类型的命令,则通过指定
@()
来在清单中显式指定此项。 缺少此项或$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 脚本。