脚本:在powershell中做什么?

Mic*_*cah 14 powershell

我之前在变量上看到过这种语法,并且不完全确定它是什么:

$script:Foo = "Bar"
Run Code Online (Sandbox Code Playgroud)

Kei*_*ill 13

$script:Foo在这种情况下,语法最常用于修改脚本级变量$Foo.当用于读取变量时,通常$Foo就足够了.例如,而不是写这个:

verbose-script.ps1
$script:foo = ''
function f { $script:foo }
Run Code Online (Sandbox Code Playgroud)

我会写这个(更简洁和功能相当):

script.ps1
$foo = ''
function f { $foo }
Run Code Online (Sandbox Code Playgroud)

在哪里$script:Foo,当你想从另一个范围内修改脚本级变量如函数或匿名脚本块如至关重要的是:

PS> $f = 'hi'
PS> & { $f; $f = 'bye';$f }
hi
bye
PS> $f
hi
Run Code Online (Sandbox Code Playgroud)

请注意,$f即使我们将其修改bye为scriptblock内,脚本块外部也没有更改.发生的事情是我们只修改了本地副本$f.如果不应用像script:(或global:)这样的修饰符,PowerShell将对copy-on-write高位变量执行一个具有相同名称的局部变量.

鉴于上面的例子,如果我们真的想要永久改变$f,那么我们将使用一个修饰符script:,global:例如:

PS> $f = 'hi'
PS> & { $f; $global:f = 'bye';$f }
hi
bye
PS> $f
bye
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 6

script:前缀导致脚本范围要查找在右侧的名字.本质上是脚本本身的本地数据.其他有效范围包括全球,本地和私人.

范围的帮助部分包含有关此主题的一些详细信息.

help about_Scopes
Run Code Online (Sandbox Code Playgroud)

  • 在函数中使用 `$foo:script` 会破坏默认的“写时复制”行为并修改脚本级的 `$foo` 变量。在一个“全局变量和脚本级别”变量比比皆是的系统中,“写时复制”是一种很好的方式 - 防止完全混乱,并在您更改函数内的全局变量时使其更加明显。 (2认同)