模块 ScriptToProcess:是否可以抢先将函数加载到模块范围内?

Module ScriptToProcess: Is it possible to load functions into module scope preemptively?

我最近在模块清单中发现了 ScriptsToProcess 成员,并试图探索使用它来简化模块中下标的组织。我认为重用我现有的清单文件来加载 ScriptsToProcess 成员中的下标,而不是使用单独的模块下标来加载我所有的下标。

它似乎适用于我的枚举——至少,我认为是这样。但是我的功能无法正常工作,而且我还没有将模块 运行 推到它试图实例化其中一个 类.

的位置

示例:

PS>New-Item -Path test/test.psm1 -Force
PS>cd test

test.psm1

Function testModule {
    callEcho
}
Export-ModuleMember -Function testModule

test.psd1

    PS>New-ModuleManifest -Path .\test.psd1 -RootModule .\test.psm1 -ScriptsToProcess .\subscripts\functions.ps1
    PS>New-Item -Path subscripts/functions.ps1 -Force

函数。ps1

Function writeEcho {
    write-host 'it worked!'
}
Write-Host 'ScriptsToProcess has loaded me'
PS>Import-Module .\test.psd1 -Force
PS>testModule
callEcho : The term 'callEcho' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

我的模块无法访问该功能。

我认为这是有意为之的,那么有没有其他方法可以解决这个问题,或者我是否需要制作一个单独的文件,在模块的开头以点作为我所有下标的来源?

此外,此行为是否也适用于 类?

PS5.1.14393

ScriptsToProcess 脚本在 进口商的 范围内是点源的,除非该范围恰好是 global 范围,[1] 您的模块将看不到定义。

要在 您的模块 的上下文中使用点源帮助程序脚本,请将它们放在名为 scripts 的子目录中,然后将以下代码放在您的RootModule .psm1 文件:

Get-ChildItem $PSScriptRoot/scripts -Filter *.ps1 |
  ForEach-Object { . $_.FullName }

请注意,除非您明确导出这些脚本中定义的函数,否则它们将仅在模块内可见。


关于使 enumclass 定义可供 进口商 使用:

在您的模块中定义它们并让导入器通过using module而不是通过Import-Module.

导入模块

仅使用 ScriptsToProcess 脚本使 enumclass 可供导入程序使用 如果您不在模块中也使用它们.

请注意,如果您尝试将同一脚本与 both ScriptsToProcess and 模块内部点源一起使用,你最终会得到 enums 和 classes 在这两种情况下 不一样 - 即使它们 出现 成为.


[1] 也就是说,当您 运行 Import-Module 直接从交互式 Powershell 提示 (或当您使用等效机制)——重要的是 importer 运行 所在的范围。这与 将模块加载到 的范围无关, 例如 Import-Module -Global