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

如何使用Powershell修改父范围变量,powershell,Powershell,我是powershell的新手,只是不知道如何修改父作用域中的变量: $val = 0 function foo() { $val = 10 } foo write "The number is: $val" 当我运行它时,我得到: 号码是:0 我希望是10点。但是powershell正在创建一个新变量,该变量隐藏在父作用域中 我尝试过这些,但没有成功(根据文档): 但可以说,这些文件甚至不能“编译”。 我遗漏了什么?如果你想使用它,你可以这样做: $global:val=0 fu

我是powershell的新手,只是不知道如何修改父作用域中的变量:

$val = 0
function foo()
{
    $val = 10
}
foo
write "The number is: $val"
当我运行它时,我得到:

号码是:0
我希望是10点。但是powershell正在创建一个新变量,该变量隐藏在父作用域中

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

但可以说,这些文件甚至不能“编译”。
我遗漏了什么?

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

$global:val=0 
function foo()
{
    $global:val=10 
}
foo
write "The number is: $val"

您不需要使用全局范围。shell控制台中可能已经存在同名变量,您可以对其进行更新。使用脚本范围修改器。使用范围修饰符时,变量名中不包含$符号


$script:val=10

让我指出第三种选择,尽管答案已经给出。如果您想更改一个变量,不要害怕通过引用传递它,并以这种方式使用它

$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
这将返回:

1
In bar(), $lcl.Value starts as 1
In bar(), $lcl.Value ends as 10
10

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

$val = 0
function foo {
    Set-Variable -scope 1 -Name "Val" -Value "10"
}
foo
write "The number is: $val"
更多信息可以在Microsoft文档文章中找到


请注意,递归函数要求相应地调整范围:

$val = ,0
function foo {
    $b = $val.Count
    Set-Variable -Name 'val' -Value ($val + ,$b) -Scope $b
    if ($b -lt 10) {
        foo
    }
}

第一行可以是
$val=0
,因为它是隐式全局范围。这不起作用。我在表达式或语句中得到:意外标记“val”。请确保您有$global:val而不是$global:$val这是最接近问题的答案,因为直接父作用域中的变量正是被访问的。我知道这是非常旧的,但这正是我要寻找的答案。非常非常感谢!
$val = ,0
function foo {
    $b = $val.Count
    Set-Variable -Name 'val' -Value ($val + ,$b) -Scope $b
    if ($b -lt 10) {
        foo
    }
}