在函数执行后访问函数内部创建的变量

时间:2012-01-01 15:18:12

标签: function variables powershell

我正在使用一个函数,它创建了一些我想在处理函数后使用的变量。 我试过直接访问它们但我不能。我该怎么做呢?

3 个答案:

答案 0 :(得分:9)

函数运行后,函数内部的变量无法生存。如果要在处理函数后访问它们,请在其前面添加范围修饰符。

PS> function test-var{ $script:var='foo' }
PS> test-var # excute the function
PS> $var #print var
foo

在控制台中输入以下内容以获取更多信息:

PS> Get-Help about_Scopes

答案 1 :(得分:6)

正如Shay指出的那样,你可以在函数范围内创建所谓的全局变量,这些变量将在更高级别的范围内可用。然而,全局变量通常不是一个好主意,我想为您提出一些替代方案。

这是来自维基百科global variable页面:

  

他们通常被认为是不好的做法,正是因为他们的   非本地化:可以从中修改全局变量   任何地方(除非它们位于受保护的内存中或其他地方   渲染为只读),程序的任何部分都可能依赖于它。[1]   因此,全局变量具有无限的创建潜力   相互依赖,并增加相互依赖性   复杂性。

一些替代方案:

  • 使调用者所需的函数返回数据。 Powershell函数通常应该在Verb- Noun 的Powershell函数naming convention中返回与名词相关的数据。如果您需要返回与名词无关的其他数据,请考虑制作第二个函数。

    function Get-Directories {
        param ([string] $Path)
    
        # Code to get or create objects here.
        $dirs = Get-ChildItem -Path $Path | where {$_.PsIsContainer}
    
        # Explicitly return data to the caller.
        return $dirs
    }
    
    $myDirs = Get-Directories -Path 'C:\'
    
  • 使用reference variable。引用将内存中的变量地址传递给函数。当函数更改变量的数据时,它将在函数外部访问,但变量的范围不会被更改。

    function Get-Directories {
        param ([string] $Path, [ref] $Directories)
        $Directories.Value = Get-ChildItem -Path $Path | where {$_.PsIsContainer}
    }
    
    $myDirs = $null
    Get-Directories -Path 'C:\' -Directories ([ref] $myDirs)
    

希望这会有所帮助。快乐的编码: - )

答案 2 :(得分:3)

如果你运行你的功能。 ,该函数将在您的范围内执行,函数中定义的所有变量都可供调用者使用。

即。

. $func
$myPrivateVariable # Now Set in the parent scope.

如果函数在模块中,您也可以使用这种技巧来访问模块的范围:

$m  =Get-Module myModule
. $m { $myPrivateModuleVariable  }

希望这有助于