2011-11-03 52 views
7

我有一個簡單的模塊:varExp.psm1

$ VAR1 = 20

出口型ModuleMember -Variable VAR1

我導入此模塊插入PS會話:

PS>導入模塊\ varExp.psm1

然後

PS> $ VAR1

但經過我導入第二次

PS>導入模塊。\ varExp。 psm1

PS> $ VAR1

PS>

$ VAR1成爲空...

任何人知道這到底是怎麼回事呢? (PS2.0)

編輯:有解決方法:強制重新加載Import-Module .\varExp.psm1 -Force,並測試模塊是否加載之前:if(-not (Get-Module varExp)) { Import-Module .\varExp.psm1 }。但是我希望在簡單情況下可以獲得一些原因。

+0

我認爲真正的WTF在這裏是一個已經導入的模塊的Import-Module(不帶-Force)不會產生錯誤並且確實會造成損害。 [Microsoft Connect]上報告了類似的情況(https://connect.microsoft.com/PowerShell/feedback/details/564927/import-module-fails-to-identify-if-a-module-is-already-loaded -when-the-modulestoprocess-manifest-attribute-contains-a-relative-path) – OldFart

回答

4

我不知道會發生什麼,但是當您重新導入模塊時,必須使用-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 us es默認情況下最後導入的成員。 變量和別名被替換,並且原件不是 可訪問。

我覺得originals are not accessible手段在這個$var1是無法訪問的,當你重新導入模塊。

+0

謝謝!我其實知道 - 強制和關於if(Get-Module ...)。真正的問題在這裏:var1值在哪裏?如果它被替換 - 替換的價值在哪裏?在這裏,文檔或實現有一個錯誤。 – iank

2

對我來說@manojlds給出了答案的有趣部分。

這裏有一些更多的觀測,可以幫助@iank睡覺第二天晚上:

當你第一次加載,你可以使用下面的COMMANDE

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)模塊從內存中的信息重新加載和VAR是真正取代,但什麼也沒有。如果您移除模塊或使用-Force,則該模塊將從文件重新加載。請嘗試以下操作:

PS> import-module .\varExp.psm1 
PS> Remove-Variable var1 
PS> import-module .\varExp.psm1 
PS> Get-ChildItem variable: 
... 
var1 
... 

$ Var1被重新創建但未分配。