【问题标题】:How to export a variable from a powershell module function?如何从 powershell 模块函数中导出变量?
【发布时间】:2019-04-15 18:51:43
【问题描述】:

请注意:

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

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

【问题讨论】:

标签: powershell module scope powershell-module


【解决方案1】:

行为都是about scopes。 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

现在我们可以看到脚本范围内的变量被传递出去了。我们永远不会看到本地范围的变量,因为它们只存在于当前范围内。例如在这个例子中,self包含在函数的内部。

【讨论】:

  • 在最后一个示例中,您的意思是. .\sample.ps1 吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2019-11-14
  • 2011-09-09
  • 1970-01-01
  • 2014-10-25
  • 2019-11-21
  • 1970-01-01
相关资源
最近更新 更多