Поведение - все о границах .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"
#List Loaded modules after
Get-Module
}
#Only present desired functions
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}
Success!