2

How to Write a PowerShell Module Manifest-PowerShell中,我了解到我可以使用VariablesToExport = '*'.

但是,使用后发现无法导出任何变量。

在编写测试以确认并阅读更多文档后,我没有找到问题的原因。我可能忽略了一些重要的事情。

这里发生了什么?

# TestModule.psm1 excerpt:
0..9 | ForEach-Object { New-Variable -Name "v_$_" -Value $_ }

# TestModule.psd1 excerpt:
@{ModuleVersion = '1.0';RootModule = 'TestModule.psm1';VariablesToExport = '*'}

# TestModule.Tests.ps1(Module has been imported)
 # 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 }
4

1 回答 1

3

这远非显而易见,但是,从 PowerShell 7.2 开始,为了从 PowerShell模块中导出变量,仅在模块清单的(文件)条目中列出它们是不够*.psd1VariablesToExport

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

警告

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

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

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

重要

对于具有模块清单 ( *.psd1) 和脚本模块 ( *.psm1)的模块,导出逻辑是一个两步过程

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

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

    • 奇怪的是,对于动态模块——使用创建的内存模块New-Module——它只是函数

  • 导出相关清单 ( *.psd1) 条目- FunctionsToExport, AliasesToExport, VariablesToExportCmdletsToExport仅适用于从程序集导出的二进制cmdlet ) -进一步过滤这些候选导出,过滤结果是模块的有效导出。

    • '*'注意:正如新生成的模块清单中的注释所建议的那样,清单中应避免使用诸如 , 之类的通配符模式,因为它们会减慢自动加载模块的命令发现速度;定义应按其全名一一列举。

调试提示

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

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

于 2021-08-31T03:22:04.067 回答