2012-01-01 87 views

回答

8

函数内部的变量在函数运行后无法存活。如果你想在函数处理后访问它们,用一个作用域修饰符作为它们的前缀。

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

键入此在控制台的详细资料:

PS> Get-Help about_Scopes 
+0

非常感谢! – Sune 2012-01-01 15:45:17

5

为吉文指出,你可以创建所谓的功能范围,将提供更高的级别范围内的全局变量。然而,全局变量通常不是一个好主意,我想为你提供一些替代方案。

这是从维基百科global variable页:

他们通常被认为是不好的做法,恰恰是因为他们 非局部性的:一个全局变量的原因可能源自 任何地方(除非他们居住在受保护的内存进行修改或者以其他方式 呈现为只读),并且该程序的任何部分都可能取决于它[1]。 因此,全局变量具有创建相互依赖的无限潜力,并且增加相互依赖性增加了复杂性。

一些替代方案:

  • 使函数返回通过呼叫者需要数据。 Powershell函数通常应返回Verb-的名称的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) 
    

希望这有助于。快乐编码:-)

+0

谢谢你的回答! – Sune 2012-01-05 22:00:26

3

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

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

如果函数是在一个模块中,你也可以用这种伎俩来访问模块的范围:

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

希望这有助于

+0

谢谢!但是,为什么你在前面用美元符号来运行你的函数呢?像一个变量? – Sune 2012-01-05 22:01:08

+0

因为它是一个样本:-)虽然,你也可以用这种方式处理命令。即$ a = Get-Command Get-Command; &$ a或ScriptBlock:$ a = {$ b = 1}; 。美元; $ b – 2012-01-05 22:07:00