在再次导入相同模块后,从模块导入的变量变为$ null

时间:2011-11-03 20:33:51

标签: powershell powershell-v2.0

我有一个简单的模块: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值背后的原因。

2 个答案:

答案 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已重新创建,但未分配。