Поведение - все о границах .TLDR:
Сеансы, модули и вложенные приглашения являются автономными средами, но они не являются дочерними областями глобальной области действия в сеансе.
По сути,поскольку модули не являются дочерними областями, они не могут устанавливать переменные области действия сценария в «родительской» области действия сценария.
Давайте проверим области действия внутри модуля:
sampleModule.psm1
Function Test-Local { $local:l = Get-Date }
Function Test-Script { $script:s = Get-Date }
Function Test-Global { $global:g = Get-Date }
#Only present desired functions
Export-ModuleMember -Function Test-Local, Test-Script, Test-Global
И работает:
PS C:> Import-Module .\sampleModule.psm1
PS C:> Test-Local
PS C:> Test-Script
PS C:> Test-Global
PS C:> Write-Host "Local $l"
Local
PS C:> Write-Host "Script $s"
Script
PS C:> Write-Host "Global $g"
Global 04/15/2019 17:12:23
Как мы видим, поскольку модули работают в своей собственной автономной среде, но все еще являются частью сеанса глобальной области действия,способ передачи переменных в этом случае использования - использование области действия $global
.
Функции также действуют по-разному в зависимости от того, как вы их запускаете.НапримерВозьмите этот пример сценария:
sample.ps1
Function Test-Local { $local:l = Get-Date }
Test-Local
Function Test-Script { $script:s = Get-Date }
Test-Script
Function Test-Global { $global:g = Get-Date }
Test-Global
И по приглашению запустим его в области действия сценария:
PS C:> .\sample.ps1
PS C:> Write-Host "Local $l"
Local
PS C:> Write-Host "Script $s"
Script
PS C:> Write-Host "Global $g"
Global 04/15/2019 17:14:56
Обратите внимание, что вы не можете получить доступ к переменной из локальной области или области видимости скрипта.Давайте перезапустим PowerShell и теперь попробуем оператор вызова (&
):
PS C:> & .\sample.ps1
PS C:> Write-Host "Local $l"
Local
PS C:> Write-Host "Script $s"
Script
PS C:> Write-Host "Global $g"
Global 04/15/2019 17:22:07
Те же результаты.Теперь давайте запустим его в локальной области видимости с помощью оператора точки (.
):
PS C:> . .\sample.ps1
PS C:> Write-Host "Local $l"
Local
PS C:> Write-Host "Script $s"
Script 04/15/2019 17:24:16
PS C:> Write-Host "Global $g"
Global 04/15/2019 17:24:16
Теперь мы видим, что переменная в области видимости сценария пропущена.Мы никогда не увидим переменные локальной области видимости, потому что они присутствуют только в их текущей области видимости.например, в этом примере самодостаточный внутри функции.