PowerShell模块中的内部函数

时间:2016-01-24 17:08:58

标签: powershell module

我正在编写一个模块,并且我有一些我不希望暴露的辅助函数,但我确实希望在内部使用模块函数。我已经设置了我的目录结构,如:

root\
..Private
....Invoke-PrivateTest.ps1
....private.psd1
....private.psm1
..Public
....Get-Something.ps1
....Public.psd1
....Public.psm1
..test.psd1

我在github https://github.com/jpbruckler/test上设置了一个存储库,其中包含所有模块文件。

我期待的行为是Get-Something是一个公共功能。运行Get-Command -Module Test时,应列出它。相反,Invoke-PrivateTest不应该在该命令的输出中。

调用Get-Something时,应输出文字Invoke-PrivateTest called。相反,我收到一条错误,指出命令Invoke-PrivateTest不存在。

我在test.psd1明确说明只导出Get-Something函数。

私有模块和公共模块都是通过NestedModules中的test.psd1属性调用的。任何帮助或指示将不胜感激。

2 个答案:

答案 0 :(得分:1)

@PetSerAl指出了我正确的方向。最终,这归结为一个范围问题。我安排模块的方式,每个子模块都需要调用加载私有模块,这是一堆代码重复 - 也是我希望通过拆分一些辅助函数来避免的。

为了让一切工作,而不是多个子模块,我只是将Public文件夹拆分为子文件夹,这些子文件夹将保存执行类似操作的脚本,基本上从中移除所有.psd1和.psm1文件Public目录。我为Private目录做了同样的事情。这给我留下了一堆松散的.ps1文件,我在test.psm1加载了以下代码:

$Private = (Get-ChildItem -Path (Join-Path $PSScriptRoot 'Private') -Filter *.ps1)
$Public = (Get-ChildItem -Path (Join-Path $PSScriptRoot 'Public') -Filter *.ps1 -Recurse)


foreach ($Script in $Public) {
    . $Script.FullName
    Export-ModuleMember $Script.BaseName
}

foreach ($Script in $Private) {
    . $Script.FullName
}

我已在https://github.com/jpbruckler/test修改了测试模块以反映我所做的更改。

答案 1 :(得分:0)

除非您有其他理由将代码放入单独的(子)模块中,否则我将其保存在一个文件夹中并控制通过函数名称导出的内容。使用&#34;官方&#34;用于公共函数名称的符号(<Verb>-<Noun>),并省略私有函数(<Verb><Noun>)中的连字符。这样,您可以在全局.psd1中导出公共函数,如下所示:

FunctionsToExport = '*-*'