我之前在变量上看到过这种语法,并且不太确定它到底是什么:
$script:Foo = "Bar"
答案 0 :(得分:10)
语法$script:Foo
最常用于修改脚本级变量,在本例中为$Foo
。当用于读取变量时,通常$Foo
就足够了。例如,而不是写这个:
verbose-script.ps1
$script:foo = ''
function f { $script:foo }
我会写这个(更简洁,功能更等):
script.ps1
$foo = ''
function f { $foo }
$script:Foo
至关重要的地方是你想要修改另一个范围内的脚本级变量,例如函数或匿名脚本块,例如:
PS> $f = 'hi'
PS> & { $f; $f = 'bye';$f }
hi
bye
PS> $f
hi
请注意,即使我们在scriptblock中将其修改为$f
,脚本块外的bye
也不会更改。发生的事情是我们只修改了$f
的本地副本。如果不应用script:
(或global:
)之类的修饰符,PowerShell将对高格范围的变量执行copy-on-write
到具有相同名称的局部变量。
鉴于上面的示例,如果我们真的想对$f
进行永久性更改,我们会使用script:
或global:
之类的修饰符,例如:
PS> $f = 'hi'
PS> & { $f; $global:f = 'bye';$f }
hi
bye
PS> $f
bye
答案 1 :(得分:5)
script:
前缀会导致在脚本范围内查找右侧的名称。本质上是脚本本身的本地数据。其他有效范围包括全球,本地和私人。
范围的帮助部分包含有关此主题的一些详细信息。
help about_Scopes