首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PowerShell中的变量作用域

PowerShell中的变量作用域
EN

Stack Overflow用户
提问于 2012-02-17 17:14:02
回答 1查看 124.9K关注 0票数 69

关于PowerShell的一个可悲的事情是函数和脚本块是动态作用域的。

但另一件让我惊讶的事情是,变量在内部作用域中的行为就像写时复制。

代码语言:javascript
复制
$array=@("g")
function foo()
{
    $array += "h"
    Write-Host $array
}

& {
    $array +="s"
    Write-Host $array
}
foo

Write-Host $array

输出为:

代码语言:javascript
复制
g s
g h
g

这使得动态作用域不那么痛苦。但是我如何避免写时复制呢?

EN

回答 1

Stack Overflow用户

发布于 2019-08-17 21:32:38

虽然其他帖子提供了许多有用的信息,但它们似乎只是为了让你免于使用RTFM。

没有提到的答案是我发现的最有用的答案!

代码语言:javascript
复制
([ref]$var).value = 'x'

这将修改$var的值,无论它恰好在什么作用域中。您不需要知道它的作用域;只需要知道它实际上已经存在。使用OP的示例:

代码语言:javascript
复制
$array=@("g")
function foo()
{
    ([ref]$array).Value += "h"
    Write-Host $array
}
& {
    ([ref]$array).Value +="s"
    Write-Host $array
}
foo
Write-Host $array

产生:

代码语言:javascript
复制
g s
g s h
g s h

解释:

(ref$var)获取指向变量的指针。因为这是一个读操作,所以它解析到实际创建该名称的最新作用域。它还解释了变量不存在时的错误,因为ref不能创建任何东西,它只能返回对已经存在的东西的引用。

然后,.value将您带到保存变量定义的属性;然后您可以设置该属性。

您可能会想做这样的事情,因为它有时看起来很有效。

代码语言:javascript
复制
([ref]$var) = "New Value"

不要!

它看起来可以工作的实例是一种错觉,因为PowerShell正在做的事情只在一些非常有限的情况下才能做,比如在命令行上。你不能指望它。事实上,它在OP示例中不起作用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9325569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档