powershell - 为什么不能使用 VariablesToExport 导出 PowerShell 模块中的变量成员?

标签 powershell variables module powershell-module module-export

来自 How to Write a PowerShell Module Manifest我了解到我可以使用 VariablesToExport = '*' 导出模块中的所有变量。但是使用之后发现无法导出任何变量。

写了测试确认,看了更多的文档,也没找到问题的原因。我可能忽略了一些重要的事情。这是怎么回事?

TestModule.psm1 摘录:

0..9 | ForEach-Object { New-Variable -Name "v_$_" -Value $_ }

TestModule.psd1 摘录:

@{ModuleVersion = '1.0';RootModule = 'TestModule.psm1';VariablesToExport = '*'}

TestModule.Tests.ps1:

 # Confirm that the module has indeed been imported.
$ModuleName | Get-Module | ForEach-Object 'name' | Should -Be $ModuleName
 # All variables do not exist.
0..9 | ForEach-Object { "variable:v_$_" | Test-Path | Should -BeFalse }

最佳答案

这远非显而易见,但是,从 PowerShell 7.2 开始,为了从 PowerShell module 导出变量,将它们列在模块 manifest 的 (*. psd1 文件的)VariablesToExport 条目单独 不够:

需要在您的脚本模块文件(*.psm1)中调用 Export-ModuleMember -Variable >) - 请务必将其放在文件的末尾,以确保已完成所有要导出的定义。

警告:

  • 一旦 *.psm1 模块调用 Export-ModuleMember所有 要导出的定义必须显式导出;-Function-Cmdlet-Alias 参数也必须酌情指定;在所有情况下,通配符 * 可用于指定给定类型的所有 定义,也可以使用更具体的 wildcard 名称模式。

例如,要导出所有 $v_* 变量,以及所有匹配名称模式 *-Foo* 的函数,请将以下内容放在您的底部*.psm1 文件:

Export-ModuleMember -Variable v_* -Function *-Foo*

重要:

对于具有模块 list (*.psd1) 的模块 - 通常情况下 - 和脚本模块 (*.psm1),导出逻辑是一个两步过程:

  • Candidate 导出定义是从 *.psm1 自身 导出的所有定义 - 或者隐式,或显式使用 Export-ModuleMember 语句。

    • 隐式导出 - 即在没有 Export-ModuleMember 调用的情况下执行的自动导出 - 包括所有函数别名,但不是变量

    • 奇怪的是,对于动态模块 - 使用 New-Module 创建的内存中模块 - 它仅功能

  • 导出相关 list (*.psd1) 条目 - FunctionsToExportAliasesToExportVariablesToExport(CmdletsToExport 仅适用于从程序集导出的二进制 cmdlet)-进一步过滤这些候选导出和过滤后的结果是模块的有效导出。

    • 注意:正如新生成的模块 list 中的注释所建议的那样,通配符模式如 '*' 应该在 list 中避免,因为它们会减慢 auto-loading modules 的命令发现下;定义应通过其全名明确列举。

调试技巧:

  • 要查看给定模块导出的定义,请使用 -Verbose 开关调用 Import-Module

    • Importing ... 行是导入到调用者范围内的导出定义。
    • 如果 *.psm1 文件调用Export-ModuleMember,您还会看到上面描述的两步过程操作:Exporting ... 行在 Importing ... 之前描述了隐式候选导出。
  • 要在修改其定义后强制重新导入已导入的模块,请使用 -Force 开关调用 Import-Module

关于powershell - 为什么不能使用 VariablesToExport 导出 PowerShell 模块中的变量成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68992255/

相关文章:

xml - 如何在 powershell 中使用带有命名空间的 xpath 访问元素?

python - 在 Python 中使用变量进行 Xpath 查询

string - 在线托管可编辑的单个文本字符串?

python - 在 python 中构建一个调用图,包括模块和函数?

Python:从源代码中安装模块

PowerShell:如何在循环中更改表头?

powershell - 如何使用 REST API 销毁 TFVC 中的分支?

azure - 如何通过 PowerShell 枚举 Azure 逻辑应用中是否建立了连接器?

javascript - 我可以在 JavaScript 的不同 for 循环中声明同一个变量两次吗?

perl - 安装缺少的 Perl 模块的最简单方法是什么?