gpt4 book ai didi

Powershell大师,请澄清函数中的变量范围

转载 作者:行者123 更新时间:2023-12-03 13:03:22 25 4
gpt4 key购买 nike

我读到当函数脚本是点源时,函数范围内的变量可以在当前范围内访问。

这是真的吗?这很奇怪,我认为不寻常...

我能澄清一下这其中的原因吗?例如,my-f$my-f-var对于某个整数,假设为 2:

PS1> . .\my-f-script.ps1
PS1> my-f
PS1> $my-f-var
2

我希望 $my-f-var无法访问,因为在函数内部!有没有办法将变量设为私有(private),或者在没有点源脚本的情况下调用函数?

最佳答案

函数中的变量在该范围内是本地的,除非您在函数名称的调用处加点。当您点源脚本时,顶级脚本变量将与函数定义一起有效地导入当前范围,例如:

PS> '$scriptvar = 2; function my-f { ${my-f-var} = 2 }' > my-f-script.ps1
PS> Remove-Variable scriptvar, my-f-var
Remove-Variable : Cannot find a variable with name 'scriptvar'.
Remove-Variable : Cannot find a variable with name 'my-f-var'.
PS> . .\my-f-script.ps1
PS> $scriptvar
2
PS> ${my-f-var}
PS>

请注意, ${my-f-var} 未在本地范围内定义。但是,如果我“点”函数的调用,则其内容将在当前范围内运行,例如:
PS> . my-f
PS> ${my-f-var}
2

在这种情况下,函数中设置的变量设置在当前(调用)范围内,因为用于调用它的“点”。

还有几点:您可以使用 Get-Variable -scope 访问各种范围的变量。或更方便(如果不太灵活)全局、脚本、本地和私有(private)修饰符。当您访问在更高范围内定义变量的函数内的变量时,您可以很好地阅读它。但是当你设置它时,PowerShell 本质上是对变量进行“写入时复制”——创建一个新的副本,范围从该函数向下(即到它调用的其他函数)。如果您真的想修改更高范围的变量,您可以使用 $global:Foo 或 $script:Foo 在这些范围内进行修改。
local如果您想避免无意中使用在函数外部定义的变量,则作用域会派上用场。另一位 MVP 在上次 MVP 峰会上提出了这一点,这似乎是那些“最佳实践”技巧之一。这是场景:
PS> $foo = 'bad'
PS> function testscope { $fooo = 'good'; "The value of `$fooo is $foo" }
PS> testscope
The value of $fooo is bad

请注意,在这种情况下使用 $foo函数内部是一个错字,但巧合的是,该错字名称有一个变量。这不是该函数的意图,它无法正常工作,尽管在这种情况下很难看到。下面,我们可以使用 local说明符以确保函数仅在变量的本地范围内查找。由于拼写错误,它没有找到它,但至少现在更容易发现错误。
PS> function testscope { $fooo = 'good'; "The value of `$fooo is $local:foo" }
PS> testscope
The value of $fooo is
private当您不希望某些变量对您的函数调用的其他函数可见时,范围很有用。

关于Powershell大师,请澄清函数中的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521513/

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