Как экспортировать переменную из функции модуля powershell? - PullRequest
1 голос
/ 15 апреля 2019

Пожалуйста, соблюдайте:

C:\> $TestVariable
C:\> $a
C:\> get-command Test-VariableExport

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Test-VariableExport                                0.0.0.1    Test


C:\> (get-command Test-VariableExport).ScriptBlock

    $script:TestVariable = Get-Date

C:\> Test-VariableExport
C:\> $TestVariable
C:\> function f() { $script:a = Get-Date }
C:\> f
C:\> $a

Monday, April 15, 2019 2:48:59 PM


C:\> f
C:\> $a

Monday, April 15, 2019 2:49:03 PM


C:\>

Тот же самый точный код, когда внутри только функция работает - переменная a экспортируется из функции во внешнюю область видимости. Но когда функция является частью модуля, как в случае функции Test-VariableExport, экспорт не работает.

Как я могу заставить его работать для функции модуля?

1 Ответ

0 голосов
/ 16 апреля 2019

Поведение - все о границах .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

Теперь мы видим, что переменная в области видимости сценария пропущена.Мы никогда не увидим переменные локальной области видимости, потому что они присутствуют только в их текущей области видимости.например, в этом примере самодостаточный внутри функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...