鉴于我有:
$a = "world"
$b = { write-host "hello $a" }
如何获取脚本块的解析文本,它应该是包含 write-host 的 entre 字符串:write-host "hello world"
更新:补充说明如果你只是打印
$b
你会得到变量而不是解析值write-host "hello $a"
如果您使用 & $b
执行脚本块,您将获得打印值,而不是脚本块的内容:hello world
这个问题正在寻找一个字符串,其中包含带有评估变量的脚本块的内容,它是:write-host "hello world"
最佳答案
与原始问题一样,如果您的整个 scriptblock 内容不是字符串(但您希望它是)并且您需要在 scriptblock 中进行变量替换,则可以使用以下内容:
$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。关于powershell - 如何解析 Powershell 脚本块中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55063570/