9

I have a simple module: varExp.psm1

$var1 = 20

Export-ModuleMember -Variable var1

And I import this module into PS session:

PS> Import-Module .\varExp.psm1

then

PS> $var1

20

But after I import it second time

PS> Import-Module .\varExp.psm1

PS> $var1

PS>

$var1 becomes null...

Anybody knows what is going on here? (PS2.0)

Edit: There are workarounds: Forcing reloading with Import-Module .\varExp.psm1 -Force, and testing if module was loaded before: if(-not (Get-Module varExp)) { Import-Module .\varExp.psm1 }. But I was hoping to get some reason behind $null value in simple case.

1
  • I think the real WTF here is that Import-Module (without -Force) for a module that has already been imported does not produce an error and does do damage. Something similar has been reported on Microsoft Connect Commented Nov 4, 2011 at 15:31

2 Answers 2

6

I don't know exactly what happens, but when you are re-importing a module , you have to use -Force.

When you include -verbose you can see the difference between the two:

PS> import-module .\test -Verbose
VERBOSE: Importing variable 'var1'.

With force:

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'.

The documentation does say the following:

If you import members with the same name and the same type into your session, Windows PowerShell uses the member imported last by default. Variables and aliases are replaced, and the originals are not accessible.

I think the originals are not accessible means in this $var1 is not accessible when you re-import the module.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks! I actually know about -Force and about if(Get-Module ...). The real question here: where is var1 value? If it was replaced - where the replacement's value? Here, documentation or implementation has a bug.
yeah the issue is that the variable is empty. I have this problem too. I need to import a module several time and only import specific variables
3

For me @manojlds gives the interesting part of the answer.

Here are some more observations that can help @iank to sleep next night :

when you first load the module you can use the following commande

PS> $a = Import-Module .\varExp.psm1 -PassThru
PS> $a.ExportedVariables.var1
Name                           Value
----                           -----
var1                           20

Now you change the file .\varExp.psm1 to add a new var $var2=30 and also export it. If you stay in the same powershell you can test. $var2 does not appear.

PS> $b = Import-Module .\varExp.psm1 -PassThru
PS> $b.ExportedVariables
Name                           Value
----                           -----
var1                           

For me as you do not remove the module (Remove-Module varexp) the module is reloaded from the memory information and vars are really replace but with nothing. If you remove the module or use -Force the module is reloaded from file. Try the following :

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

$Var1 is recreated but not assign.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.