如何从powershell模块函数导出变量?

如何从powershell模块函数导出变量?,powershell,module,scope,powershell-module,Powershell,Module,Scope,Powershell Module,请注意: C:\> $TestVariable C:\> $a C:\> get-command Test-VariableExport CommandType Name Version Source ----------- ---- ------- ------ F

请注意:

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
从函数导出到外部作用域。但是,当函数是模块的一部分时,如
测试变量导出
函数的情况,导出不起作用

如何使其适用于模块功能?

行为就是一切。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
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:> 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 }
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
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 04/15/2019 17:24:16
PS C:> Write-Host "Global $g"
Global 04/15/2019 17:24:16

现在我们可以看到脚本范围中的变量已传递出去。我们永远不会看到局部作用域变量,因为它们只存在于当前作用域中。e、 g.在本例中,函数内部是自包含的。

可能?不。调用Export ModuleMember时该变量不存在。在上一个示例中,您的意思是
\示例.ps1