如何在Powershell脚本块中解析变量

时间:2019-03-08 12:48:05

标签: powershell

鉴于我有:

$a = "world"
$b = { write-host "hello $a" }

如何获取脚本块的已解析文本,应为:

write-host "hello world"

更新:更多说明

如果仅打印$b,则会得到变量而不是解析值

write-host "hello $a"

如果使用& $b执行脚本块,则会得到打印的值,而不是脚本块的内容:

hello world

这个问题正在寻找一个字符串,其中包含脚本块的内容以及所评估的变量,即:

write-host "hello world"

1 个答案:

答案 0 :(得分:3)

与原始问题一样,如果您的整个脚本块内容不是字符串(但您希望是字符串),并且需要在脚本块内进行变量替换,则可以使用以下代码:

$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