如何从 powershell 模块函数导出变量?
How to export a variable from a powershell module function?
请注意:
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
函数一样 - 导出不起作用。
如何让它为模块功能工作?
行为都是about scopes。 TLDR:
Sessions, modules, and nested prompts are self-contained environments,
but they are not child scopes of the global scope in the session.
基本上,由于模块不是子作用域,它们不能在 "parent" 脚本作用域中设置脚本作用域变量。
让我们测试模块内的作用域:
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
范围。
函数的行为也会因您 运行 的不同而有所不同。对于前。以这个示例脚本为例:
示例。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,现在试试 Call Operator (&
):
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
现在我们可以看到脚本范围内的变量被传递了出去。我们永远不会看到 Local 作用域变量,因为它们只存在于当前作用域中。例如在此示例中,自包含到函数内部。
请注意:
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
函数一样 - 导出不起作用。
如何让它为模块功能工作?
行为都是about scopes。 TLDR:
Sessions, modules, and nested prompts are self-contained environments, but they are not child scopes of the global scope in the session.
基本上,由于模块不是子作用域,它们不能在 "parent" 脚本作用域中设置脚本作用域变量。
让我们测试模块内的作用域:
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
范围。
函数的行为也会因您 运行 的不同而有所不同。对于前。以这个示例脚本为例:
示例。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,现在试试 Call Operator (&
):
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
现在我们可以看到脚本范围内的变量被传递了出去。我们永远不会看到 Local 作用域变量,因为它们只存在于当前作用域中。例如在此示例中,自包含到函数内部。