如果您的整个脚本块内容不是字符串(但您希望它是字符串),并且您需要在脚本块内进行变量替换,您可以使用以下方法:
$ExecutionContext.InvokeCommand.ExpandString($b)
在当前执行上下文中调用.InvokeCommand.ExpandString($b)
将使用当前作用域中的变量进行替换。
以下是一种创建脚本块并检索其内容的方法:
$a = "world"
$b = [ScriptBlock]::create("write-host hello $a")
$b
write-host hello world
您同样可以使用脚本块符号 {}
来达到相同的效果,但是需要使用 &
调用运算符:
$a = "world"
$b = {"write-host hello $a"}
& $b
write-host hello world
使用上述方法的一个特点是,如果您随时更改了
$a
的值并再次调用脚本块,则输出将会更新如下:
$a = "world"
$b = {"write-host hello $a"}
& $b
write-host hello world
$a = "hi"
& $b
write-host hello hi
GetNewClosure()
方法可用于创建脚本块的克隆,以获取该脚本块当前评估的理论快照。它将不受后续代码中 $a
值更改的影响:
$b = {"write-host hello $a"}.GetNewClosure()
& $b
write-host hello world
$a = "new world"
& $b
write-host hello world
{}
表示脚本块对象,您可能已经知道了。这可以传递到 Invoke-Command
,从而打开其他选项。在脚本块内还可以创建参数,稍后可以传入。有关更多信息,请参见about_Script_Blocks。
Invoke-Command -ScriptBlock $b
输出为hello world
。 - Lee_Dailey$ExecutionContext.InvokeCommand.ExpandString($b)
来实现。 - alastairtree