1

脚本 (.ps1) 导入 ModuleA,ModuleA 导入 ModuleB。从脚本中我可以看到 ModuleB 中的一个函数(使用 Get-Command),但它被列为属于 ModuleA。我还可以修改/删除该功能。当执行进入 ModuleA 时,来自 ModuleB 的函数被列为属于 ModuleB(通过 Get-Command)并恢复到原始状态。

这是设计使然吗?

例子:

调用-Greeting.ps1

Import-Module .\Import-First.psm1

Get-Command -Module "Import-First"     # Write-Greetings and Write-Goodbye
Get-Command -Module "Import-Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # Write-Goodbye (module = Import-First) ***is this by design?***

Remove-Item "function:\Write-Goodbye"

Get-Command -Module "Import-First"     # Write-Greetings
Get-Command -Module "Import-Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # error: function doesn't exist (expected)

Write-Greetings

导入优先.psm1

Import-Module .\Import-Second.psm1
function Write-Greetings
{
    Write-Host "hello world!"              # hello world!
    Get-Command -Module "Import-First"     # Write-Greetings
    Get-Command -Module "Import-Second"    # Write-GoodBye
    Get-Command -Name "Write-GoodBye"      # Write-GoodBye (module = Import-Second) ***module changed since execution scope changed***

    Write-GoodBye
}

导入-Second.psm1

function Write-Goodbye
{    
    Write-Host "bye bye!"
}
4

1 回答 1

0

是的。当您在模块中导入模块时,嵌套模块的函数就像它们是父模块的一部分一样。导入模块时,可以将该模块的特定成员导出到全局范围。删除这些全局范围的对象不会影响内部模块。

我建议不要嵌套模块。分别导入每个模块。最好Import-Module.ps1为每个模块创建一个自定义脚本,首先导入该模块的依赖项,然后导入模块本身。所以,在你的情况下,

导入优先.ps1

& Import-Second.ps1
Import-Module First.psm1

导入-Second.ps1

Import-Module Second.psm1

调用-Greeting.ps1

& .\Import-First.ps1

Get-Command -Module "First"     # Write-Greetings and Write-Goodbye
Get-Command -Module "Second"    # no functions found
Get-Command -Name "Write-Goodbye"      # Write-Goodbye (module = Import-First) ***is this by design?***

& .\Import-Second.ps1

Get-Command -Module "First"     # Write-Greetings
Get-Command -Module "Second"    # Write-Goodbye found
Get-Command -Name "Write-Goodbye"      # function exists because it is in Second module.

Write-Greetings

您不应编写名称冲突的模块。如果它们之间的命名相似,第二个模块将始终覆盖第一个模块的函数/cmdlet/变量。您可以使用Import-Module's-NoClobber参数来防止代码被覆盖。

于 2013-07-09T19:58:30.423 回答