Sun*_*une 4 variables powershell function
我正在使用一个函数,它创建了一些我想在函数处理后使用的变量.我试过直接访问它们但我不能.我该怎么做呢?
函数运行后,函数内部的变量无法生存.如果要在处理函数后访问它们,请在其前面添加范围修饰符.
PS> function test-var{ $script:var='foo' }
PS> test-var # excute the function
PS> $var #print var
foo
Run Code Online (Sandbox Code Playgroud)
在控制台中键入以获取更多信息:
PS> Get-Help about_Scopes
Run Code Online (Sandbox Code Playgroud)
正如Shay指出的那样,你可以在函数范围内创建所谓的全局变量,这些变量将在更高级别的范围内可用.然而,全局变量通常不是一个好主意,我想为您提出一些替代方案.
这是来自维基百科的全局变量页面:
它们通常被认为是不好的做法正是因为它们的非本地性:全局变量可以从任何地方修改(除非它们驻留在受保护的内存中或以其他方式呈现为只读),并且程序的任何部分都可能依赖于它. [1] 因此,全局变量具有创建相互依赖性的无限潜力,并且添加相互依赖性会增加复杂性.
一些替代品:
使函数返回调用者所需的数据.Powershell函数通常应该在Verb- Noun的Powershell函数命名约定中返回与名词相关的数据.如果您需要返回与名词无关的其他数据,请考虑制作第二个函数.
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:\'
Run Code Online (Sandbox Code Playgroud)使用引用变量.引用将内存中的变量地址传递给函数.当函数更改变量的数据时,它将在函数外部访问,但变量的范围不会更改.
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)
Run Code Online (Sandbox Code Playgroud)希望这可以帮助.快乐的编码:-)