如何使用Powershell修改父范围变量

C J*_*son 22 powershell

我对powershell很新,我只是没有得到如何修改父作用域中的变量:

$val = 0
function foo()
{
    $val = 10
}
foo
write "The number is: $val"
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

The number is: 0
Run Code Online (Sandbox Code Playgroud)

我希望它是10.但是PowerShell正在创建一个隐藏父范围内的变量的新变量.

我试过这些,没有成功(根据文档):

$script:$val = 10
$global:$val = 10
$script:$val = 10
Run Code Online (Sandbox Code Playgroud)

但这些甚至都没有'编译'可以这么说.我错过了什么?

Sha*_*evy 26

您不需要使用全局范围.shell控制台中可能已存在具有相同名称的变量,您可以更改它.使用脚本范围修饰符.使用范围修饰符时,不要在变量名称中包含$符号.

$脚本:VAL = 10


Nic*_* W. 16

我知道这很疯狂,但我有一个类似的问题,在我的搜索中发现这篇文章,想分享我找到的答案:

$val = 0
function foo {
    Set-Variable -scope 1 -Name "Val" -Value "10"
}
foo
write "The number is: $val"
Run Code Online (Sandbox Code Playgroud)

可以在Microsoft Docs文章关于范围中找到更多信息.

  • 这是最接近问题的答案,因为正是访问了直接父作用域中的变量。 (2认同)

Nia*_*ray 7

如果你想使用它,你可以做这样的事情:

$global:val=0 
function foo()
{
    $global:val=10 
}
foo
write "The number is: $val"
Run Code Online (Sandbox Code Playgroud)

  • 确保您有 $global:val 而不是 $global:$val (3认同)

Mar*_*ark 7

让我指出第三种选择,即使答案已经完成.如果你想改变一个变量,不要害怕通过引用传递它并以这种方式使用它.

$val=1
function bar ($lcl) 
{
    write "In bar(), `$lcl.Value starts as $($lcl.Value)"
    $lcl.Value += 9
    write "In bar(), `$lcl.Value ends as $($lcl.Value)"
}
$val
bar([REF]$val)
$val
Run Code Online (Sandbox Code Playgroud)

返回:

1
In bar(), $lcl.Value starts as 1
In bar(), $lcl.Value ends as 10
10
Run Code Online (Sandbox Code Playgroud)