gpt4 book ai didi

powershell - PowerShell嵌套函数中的可变作用域

转载 作者:行者123 更新时间:2023-12-04 10:24:39 25 4
gpt4 key购买 nike

我从一家著名的/著名的公司那里获得了这个广泛的PowerShell脚本,该脚本应该可以正常工作。好吧,事实并非如此。
该脚本由许多嵌套函数组成,并带有许多变量,这些变量先传递给主父函数,然后传递给所有子函数。使用和修改所有这些变量的 child 。

为什么所有这些变量都不包含正确的数据?
这是我正在谈论的结构:

f1 {
f2 {
v #prints 0
v = 1
f3
}
f3 {
v #prints 1
v = 2
}
v = 0
f2
v #should print 2 but prints 0
}

最佳答案

在嵌套函数中,所有子函数都可以访问所有父函数的变量。对变量的任何更改在当前函数的本地范围以及随后调用的所有嵌套子函数中都是可见的。当子函数完成执行后,变量将返回到调用子函数之前的原始值。

为了将变量更改应用于所有嵌套函数作用域,需要将变量作用域类型更改为AllScope:

Set-Variable -Name varName -Option AllScope

这样,无论在嵌套函数中的哪个级别上修改变量,即使子函数终止并且父函数将看到新的更新值之后,该更改也将保持不变。

嵌套函数中变量作用域的正常行为:

function f1 ($f1v1 , $f1v2 )
{
function f2 ()
{
$f2v = 2
$f1v1 = $f2v #local modification visible within this scope and to all its children
f3
"f2 -> f1v2 -- " + $f1v2 #f3's change is not visible here
}
function f3 ()
{
"f3 -> f1v1 -- " + $f1v1 #value reflects the change from f2
$f3v = 3
$f1v2 = $f3v #local assignment will not be visible to f2
"f3 -> f1v2 -- " + $f1v2
}

f2
"f1 -> f1v1 -- " + $f1v1 #the changes from f2 are not visible
"f1 -> f1v2 -- " + $f1v2 #the changes from f3 are not visible
}

f1 1 0

打印:

f3 -> f1v1 -- 2
f3 -> f1v2 -- 3
f2 -> f1v2 -- 0
f1 -> f1v1 -- 1
f1 -> f1v2 -- 0

具有 AllScope变量的嵌套函数:

function f1($f1v1, $f1v2)
{
Set-Variable -Name f1v1,f1v2 -Option AllScope
function f2()
{
$f2v = 2
$f1v1 = $f2v #modification visible throughout all nested functions
f3
"f2 -> f1v2 -- " + $f1v2 #f3's change is visible here
}
function f3()
{
"f3 -> f1v1 -- " + $f1v1 #value reflects the change from f2
$f3v = 3
$f1v2 = $f3v #assignment visible throughout all nested functions
"f3 -> f1v2 -- " + $f1v2
}

f2
"f1 -> f1v1 -- " + $f1v1 #reflects the changes from f2
"f1 -> f1v2 -- " + $f1v2 #reflects the changes from f3
}

f1 1 0

打印:

f3 -> f1v1 -- 2
f3 -> f1v2 -- 3
f2 -> f1v2 -- 3
f1 -> f1v1 -- 2
f1 -> f1v2 -- 3

关于powershell - PowerShell嵌套函数中的可变作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com