我有一个简单的模块:varExp.psm1
$ var1 = 20
Export-ModuleMember -Variable var1
我将此模块导入PS会话:
PS> Import-Module。\ varExp.psm1
然后
PS> $ VAR1
20
但是我第二次导入后
PS> Import-Module。\ varExp.psm1
PS> $ VAR1
PS>
$ var1变为空...
有人知道这里发生了什么吗? (PS2.0)
编辑:有一些解决方法:强制使用Import-Module .\varExp.psm1 -Force
重新加载,并测试模块是否在之前加载:if(-not (Get-Module varExp)) { Import-Module .\varExp.psm1 }
。但是,我希望在简单的情况下得到$ null值背后的原因。
答案 0 :(得分:5)
我不确切知道会发生什么,但是当您重新导入模块时,您必须使用-Force
。
当您加入-verbose
时,您可以看到两者之间的区别:
PS> import-module .\test -Verbose
VERBOSE: Importing variable 'var1'.
用武力:
PS> import-module .\test -Verbose -Force
VERBOSE: Removing the imported "var1" variable.
VERBOSE: Loading module from path 'C:\test\test.psm1'.
VERBOSE: Importing variable 'var1'.
文档确实说了以下内容:
如果您将具有相同名称和相同类型的成员导入到您的 会话,Windows PowerShell默认使用最后导入的成员。 替换变量和别名,而原始文件则不替换 访问。强>
我认为重新导入模块时无法访问此originals are not accessible
中的$var1
表示。
答案 1 :(得分:2)
对我来说,@ manojlds给出了答案的有趣部分。
以下是一些可以帮助@iank在第二天晚上睡觉的观察结果:
首次加载模块时,您可以使用以下命令
PS> $a = Import-Module .\varExp.psm1 -PassThru
PS> $a.ExportedVariables.var1
Name Value
---- -----
var1 20
现在您更改文件。\ varExp.psm1以添加新的var $ var2 = 30并将其导出。如果你留在同一个powershell,你可以测试。 $ var2不会出现。
PS> $b = Import-Module .\varExp.psm1 -PassThru
PS> $b.ExportedVariables
Name Value
---- -----
var1
对我来说,因为你没有删除模块(Remove-Module varexp
),所以模块会从内存信息中重新加载,而vars实际上是替换但没有任何内容。如果删除模块或使用-Force
,模块将从文件重新加载。请尝试以下方法:
PS> import-module .\varExp.psm1
PS> Remove-Variable var1
PS> import-module .\varExp.psm1
PS> Get-ChildItem variable:
...
var1
...
$ Var1已重新创建,但未分配。