我有一些看起来像这样的模块(这是一个更小问题的最小可重复的案例,所以请耐心等待):
module-a.psm1
:
function Write-A {
Write-Host "A";
}
Export-ModuleMember Write-A;
module-b.psm1
:
Import-Module "./module-a";
function Write-B {
Write-A;
Write-Host "B";
}
Export-ModuleMember Write-B;
这些模块的使用方式如下(fail.ps1
):
Import-Module "./module-a";
Import-Module "./module-b";
Write-A;
Write-B;
Remove-Module module-b;
Write-A;
我希望得到以下结果:
A
A
B
A
但是,我得到了这个输出:
A
A
B
The term 'Write-A' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is corre ct and try again.
At fail.ps1:9 char:8
+ Write-A <<<< ;
+ CategoryInfo : ObjectNotFound: (Write-A:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
我可以引入一层间接module-c.psm1
:
Import-Module "./module-a";
Export-ModuleMember Write-A;
然后制作一个有效的例子(pass.ps1
):
Import-Module "./module-c";
Import-Module "./module-b";
Write-A;
Write-B;
Remove-Module module-b;
Write-A;
我在ps1
中唯一更改的内容是导入module-c
而不是module-a
。我得到了正确的输出:
A
A
B
A
我不理解的是,fail.ps1
删除module-b
(内部使用module-a
), 甚至删除module-a
虽然它是在会话的顶层导入的。通过引入一层间接,似乎正确地调用Remove-Module
知道另一个模块仍在引用它。这几乎就好像它没有正确地“计算参考”模块。我读过removing a loaded module,但似乎没有解释这种行为。这是Remove-Module
中的错误还是预期的行为?