PowerShell中能否在字符串内执行脚本块?期望得到指定输出
在PowerShell字符串中执行脚本块并获取预期结果
我明白你的问题——你想在双引号字符串里嵌入脚本块的执行结果,但直接把脚本块放进$()里并没有执行它,反而输出了脚本块的代码文本。这是因为PowerShell把{...}当成了一个脚本块对象,而不是可直接执行的代码,所以默认返回的是它的字符串表示。
要解决这个问题,你需要在子表达式里显式调用脚本块,用调用操作符&或者点操作符.,这样脚本块才会执行并返回结果。
正确写法示例
第一种方法:用调用操作符&执行脚本块
$s = "now is $(& {if (1 -eq 1){'then'}}) for today"
第二种方法:用点操作符.执行脚本块(效果和&一致,适合不需要跨作用域的场景)
$s = "now is $(. {if (1 -eq 1){'then'}}) for today"
执行后再输出$s,就能得到你想要的结果:
now is then for today
额外优化:简化写法
其实你完全可以不用脚本块,直接在$()子表达式里写条件语句,这样更简洁:
$s = "now is $(if (1 -eq 1){'then'}) for today"
这个写法和上面的效果完全一样,因为$()本身就支持直接执行多行或复杂语句,不需要额外包裹脚本块。
为什么原来的写法不行?
当你写$({if (1 -eq 1){'then'}})时,PowerShell会把{...}解析为一个ScriptBlock类型的对象,而不是执行它。当这个对象被转换为字符串时,就会输出它的原始代码文本,也就是你看到的if (1 -eq 1){'then'}。而用&或.调用脚本块,会触发它的执行,并返回执行后的输出结果,这样就能正确嵌入到字符串里了。
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

