最近我将超过 2K 行的 ps1 主脚本(包含许多函数和变量)移至 PowerShell 模块。 一切似乎都很好 - 导入模块后我可以调用我的函数并且它运行良好。 我注意到模块在完全准备好之前加载速度很慢。我用这个简单的命令:
Import-Module -Name .\TestModule -Verbose -Force
然后整个模块正在加载,但对我来说,它比我之前(在一个 ps1 脚本中)慢得多。
我的模块的结构就像这个简单的屏幕上一样:
在主目录中,我有 2 个文件:PSD1 和 PSM1,以及 1 个目录(公共),里面有许多目录,其中我的所有函数都按主题编目在子目录中。
在 PSD1 文件中,我使用简单的代码来添加我的功能:
> FunctionsToExport = '*'
在 PSM1 文件中,我使用此查询来查找所有 PS1 文件:
> ForEach ($Script in
(Get-ChildItem -File -Recurse -LiteralPath $PSScriptRoot -Filter *.ps1)
) {
. $Script.FullName
}
就像我用我的函数编写了导入模块一样,但在我下一步做任何事情之前,我认为我必须等待相当长的时间。 那么这个方法是否可以改进来紧固呢?
2. 我的第二个问题是关于变量的。 现在我在 ps1 中有它,也从目录加载: 公共\变量\MainVariables.ps1。 这是存储我所有变量的好方法吗?
我测试了一些解决方案,并通过将模块放在命令之间来测量它:
$ExecutionTime = [System.Diagnostics.Stopwatch]::StartNew()
Import-Module -Name .\TestModule -Verbose -Force
$ExecutionTime.Stop(); $ExecutionTime.Elapsed
最适合我的场景是所有函数的列表并将该列表添加到 psd1 文件中:
FunctionsToExport = @(
'Function1'
'Function2'
'Function3'
)
在我简单地将它们全部添加后,我的模块的负载增加了。当我特别知道这个模块之前已经加载时,我还会按照建议删除某些情况下的“-Force”开关。这可能会处理另一个命令来检查我的模块是否已经加载,就像本主题的答案之一一样: 如何检查是否安装了 PowerShell 模块?