【发布时间】:2019-07-30 09:00:49
【问题描述】:
我有一个包含多个文件的模块,其中包含函数和模块加载器。
示例函数:
Function1.ps1
function Init() {
echo "I am the module initialization logic"
}
function DoStuff() {
echo "Me performing important stuff"
}
模块加载器文件:
Module1.psm1:
$script:Functions = Get-ChildItem $PSScriptRoot\*.ps1
function LoadModule {
Param($path)
foreach ($import in @($path)) {
. $import.FullName
}
}
LoadModule script:Functions
Init # function doesn't found
所以我试图通过过程LoadModule 从文件Function1.ps1 加载函数。
调试LoadModule 显示加载了外部函数,但在完成LoadModule 过程后,函数变得不可访问,因此脚本在Init 行失败。
但是没有LoadModule函数的重写模块加载器工作正常
Module1.psm1:
Get-ChildItem $PSScriptRoot\*.ps1 | %{
. $import.FullName
}
Init # In this case - all works fine
因此,据我了解,文件函数是从放置在某个隔离范围内的函数加载的并且能够访问它们,我需要添加一些范围标志。
也许有人知道我应该添加什么以使函数 Init() 可从 module.pm1 脚本主体访问,但不能使其外部可访问(不使用 Export-ModuleMember)?
【问题讨论】:
-
函数点源文件在不同的范围内。为什么你首先需要那个包装函数?只需执行上一个代码 sn-p 中的操作即可。
-
实际上,该模块加载私有/公共和共享函数文件,我将代码移动到单独的函数以不重复代码,因为
LoadModule包含额外的逻辑,如错误处理和日志记录 -
如果您只需要调用
Init一次,那么您可以在调用后将其删除。 -
@PetSerAl 您能否更深入地解释一下通话后删除的问题?也许这就是解决方案
-
Remove-Item Function:\Init
标签: powershell powershell-module