为什么不能使用 VariablesToExport 导出 PowerShell 模块中的变量成员?
Why can't export variable members in a PowerShell module using VariablesToExport?
从 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, listing them in the module manifest 中导出 变量 (*.psd1
文件的) VariablesToExport
条目 单独 不够 :
您还需要在您的脚本模块文件中调用Export-ModuleMember
-Variable
(*.psm1
) - 务必将它放在文件的结尾,以确保所有定义要导出的已经做了。
警告:
- 一旦
*.psm1
模块调用 Export-ModuleMember
, 所有 定义必须导出 显式 ; 即 -Function
、-Cmdlet
和 -Alias
参数也必须酌情指定;在所有情况下,*
可用于指定给定类型的 所有 定义,也可以使用更具体的 wildcard 名称模式。
例如,要导出所有 $v_*
变量,以及所有匹配名称模式 *-Foo*
的函数,请将以下内容放在 *.psm1
文件的底部:
Export-ModuleMember -Variable v_* -Function *-Foo*
重要:
对于具有模块清单 (*.psd1
) 的模块 - 这是典型的 - 和脚本模块 (*.psm1
),导出逻辑是 二步过程:
候选导出定义是从*.psm1
本身[=135=导出的所有定义] - 隐式,或显式 Export-ModuleMember
语句。
隐式 导出 - 即在没有 Export-ModuleMember
调用的情况下执行的自动导出 - 包括 所有函数和别名,但不是变量.
奇怪的是,对于 动态 模块 - 使用 New-Module
创建的内存模块 - 它 仅具有功能 .
导出相关清单 (*.psd1
) 条目 - FunctionsToExport
, AliasesToExport
, VariablesToExport
(CmdletsToExport
仅适用于从 程序集 导出的 binary cmdlet)- 进一步过滤 这些候选导出 和筛选结果是模块的有效 导出。
- 注意:正如新生成的模块清单中的注释所建议的那样,
'*'
等通配符模式应该在清单中避免,因为它们会减慢[的命令发现速度=50=] 下来;定义应按其全名一一列举。
调试技巧:
要查看给定模块导出的定义,请使用 -Verbose
开关调用 Import-Module
。
Importing ...
行是导入到调用方作用域中的导出定义。
- 如果
*.psm1
文件 不 调用 Export-ModuleMember
,您还将看到上述两步过程的实际效果:Exporting ...
Importing ...
之前的行描述了隐含的 candidate 导出。
要在修改其定义后强制重新导入已导入的模块,请使用 -Force
开关调用 Import-Module
。
从 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, listing them in the module manifest 中导出 变量 (*.psd1
文件的) VariablesToExport
条目 单独 不够 :
您还需要在您的脚本模块文件中调用Export-ModuleMember
-Variable
(*.psm1
) - 务必将它放在文件的结尾,以确保所有定义要导出的已经做了。
警告:
- 一旦
*.psm1
模块调用Export-ModuleMember
, 所有 定义必须导出 显式 ; 即-Function
、-Cmdlet
和-Alias
参数也必须酌情指定;在所有情况下,*
可用于指定给定类型的 所有 定义,也可以使用更具体的 wildcard 名称模式。
例如,要导出所有 $v_*
变量,以及所有匹配名称模式 *-Foo*
的函数,请将以下内容放在 *.psm1
文件的底部:
Export-ModuleMember -Variable v_* -Function *-Foo*
重要:
对于具有模块清单 (*.psd1
) 的模块 - 这是典型的 - 和脚本模块 (*.psm1
),导出逻辑是 二步过程:
候选导出定义是从
*.psm1
本身[=135=导出的所有定义] - 隐式,或显式Export-ModuleMember
语句。隐式 导出 - 即在没有
Export-ModuleMember
调用的情况下执行的自动导出 - 包括 所有函数和别名,但不是变量.奇怪的是,对于 动态 模块 - 使用
New-Module
创建的内存模块 - 它 仅具有功能 .
导出相关清单 (
*.psd1
) 条目 -FunctionsToExport
,AliasesToExport
,VariablesToExport
(CmdletsToExport
仅适用于从 程序集 导出的 binary cmdlet)- 进一步过滤 这些候选导出 和筛选结果是模块的有效 导出。- 注意:正如新生成的模块清单中的注释所建议的那样,
'*'
等通配符模式应该在清单中避免,因为它们会减慢[的命令发现速度=50=] 下来;定义应按其全名一一列举。
- 注意:正如新生成的模块清单中的注释所建议的那样,
调试技巧:
要查看给定模块导出的定义,请使用
-Verbose
开关调用Import-Module
。Importing ...
行是导入到调用方作用域中的导出定义。- 如果
*.psm1
文件 不 调用Export-ModuleMember
,您还将看到上述两步过程的实际效果:Exporting ...
Importing ...
之前的行描述了隐含的 candidate 导出。
要在修改其定义后强制重新导入已导入的模块,请使用
-Force
开关调用Import-Module
。