如何从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
?