Переменные, импортированные из модуля, становятся $ null после того, как тот же модуль снова импортируется - PullRequest
7 голосов
/ 04 ноября 2011

У меня есть простой модуль: varExp.psm1

$ var1 = 20

Export-ModuleMember - Переменная var1

И я импортирую этомодуль в сеанс PS:

PS> Модуль импорта. \ 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 ]

5 голосов
/ 04 ноября 2011

Я не знаю точно, что происходит, но когда вы повторно импортируете модуль, вы должны использовать -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 недоступен при повторном импорте модуля.

2 голосов
/ 04 ноября 2011

Для меня @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), модуль перезагружается из информации о памяти, и переменные действительно заменяются, но ни с чем.Если вы удаляете модуль или используете -Force, модуль перезагружается из файла.Попробуйте следующее:

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

$ Var1 воссоздан, но не назначен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...