如何从电源外壳模块函数导出变量?



请注意:

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函数一样 - 导出不起作用。

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

行为完全与作用域有关。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作用域。

函数的行为也不同,具体取决于您运行它们的方式。例如。以此示例脚本为例:

样本.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

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

最新更新