行为就是一切
about scopes
. TLDR:
会话、模块和嵌套提示是自包含的环境,
基本上,由于模块是自包含的环境,而不是子范围,所以它们不能将模块导入“父”脚本范围。
即使
你用
-Force
sampleModule.psm1
Function Test-Import {
param([Parameter(Mandatory)]$Name)
Write-Host "List Loaded modules before"
Get-Module
Write-Host "Importing $Name into the current session ..."
Import-Module $Name -Force
Write-Host "Module Version $((Get-Module $Name).Version)"
Write-Host "Loaded Modules After"
Get-Module
}
Export-ModuleMember -Function Test-Import
如果我们从一个简单的空白测试开始(为了简洁起见,我删除了无关的模块):
PS C:> #Clean state - Nothing Loaded for demonstration
PS C:> Get-Module
ModuleType Version Name ExportedCommands
PS C:> Import-Module .\sampleModule.psm1
PS C:> Get-Module
ModuleType Version Name ExportedCommands
Script 0.0 Test-Module {Test-Import}
PS C:> Test-Import ActiveDirectory
List Loaded modules before
ModuleType Version Name ExportedCommands
Script 0.0 Test-Module {Test-Import}
Importing ActiveDirectory into the current session ...
Module Version 1.0.1.0
Loaded Modules After
ModuleType Version Name ExportedCommands
Manifest 1.0.1.0 ActiveDirectory {Add-ADCentralAccessPolicyMember, Add-ADComputerServiceAccount, Add-ADDomainControllerPasswordReplicationPolicy, Add-ADFineGrainedPasswordPolicySubject...}
Script 0.0 Test-Module {Test-Import}
这里我们注意到ActiveDirectory模块并没有出现在函数的开头,而是在函数的末尾被加载,并且报告了正确的版本。现在让我们看看它是否加载:
PS C:> Get-Module
ModuleType Version Name ExportedCommands
Script 0.0 Test-Module {Test-Import}
正如我们所看到的,由于模块在自己的自包含环境中运行,所以我们成功地将模块(本例中的ActiveDirectory)导入到模块作用域中,但没有像您预期的那样导入本地范围。
解决这个范围问题的唯一方法是将模块导入全局范围
-Global
比如:
Import-Module $Name -Force -Global
在示例脚本中更改这一行,然后重新导入:
PS C:> Import-Module .\sampleModule.psm1 -Force
PS C:> Get-Module
ModuleType Version Name ExportedCommands
Script 0.0 Test-Module {Test-Import}
PS C:> Test-Import ActiveDirectory
List Loaded modules before
ModuleType Version Name ExportedCommands
Script 0.0 Test-Module {Test-Import}
Importing ActiveDirectory into the current session ...
Module Version 1.0.1.0
Loaded Modules After
ModuleType Version Name ExportedCommands
Manifest 1.0.1.0 ActiveDirectory {Add-ADCentralAccessPolicyMember, Add-ADComputerServiceAccount, Add-ADDomainControllerPasswordReplicationPolicy, Add-ADFineGrainedPasswordPolicySubject...}
Script 0.0 Test-Module {Test-Import}
和以前一样。。。现在让我们检查它是否正确加载:
PS C:> Get-Module
ModuleType Version Name ExportedCommands
Manifest 1.0.1.0 ActiveDirectory {Add-ADCentralAccessPolicyMember, Add-ADComputerServiceAccount, Add-ADDomainControllerPasswordReplicationPolicy, Add-ADFineGrainedPasswordPolicySubject...}
Script 0.0 Test-Module {Test-Import}