我正在使用一个函数,它创建了一些我想在处理函数后使用的变量。 我试过直接访问它们但我不能。我该怎么做呢?
答案 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 }
希望这有助于