PowerShell 脚本块定义后如何追加命令或参数?
数据小许
结论
ScriptBlock 不支持用 += 拼接另一个脚本块,执行 $sb_1 += { echo 2 } 会报错。要增加执行步骤,可以创建一个新脚本块来调用原脚本块。如果 $logfile 稍后才计算出来,可以在调用时将它作为参数传入。
追加一条执行步骤
可以创建一个新脚本块来包装原脚本块:
$sb_1 = {
echo 1
}
$sb_combined = {
& $sb_1
echo 2
}.GetNewClosure()
& $sb_combined
执行 $sb_combined 时,会先运行 $sb_1,再输出 2。GetNewClosure() 会将创建新脚本块时可见的 $sb_1 绑定到该脚本块,因此调用时不必依赖外部作用域中是否还存在这个变量。
这种写法会在新脚本块中组合执行步骤,$sb_1 本身不会改变。需要替换或扩展逻辑时,创建新的脚本块更清楚。也可以在定义脚本块时直接写入多条命令:
$sb_both = {
echo 1
echo 2
}
将后来计算的日志路径传入脚本块
在你给出的 prog.exe 例子中,可以先计算 $logfile,再将它作为 -outfile 的值传给程序。脚本块可以这样接收参数:
$sb = {
param($LogFile)
& prog.exe -options -outfile $LogFile
}
# 在这里计算 $logfile
& $sb $logfile
调用时,$logfile 会作为参数传入。这样不必重新创建或拼接脚本块,也能避免脚本块运行时依赖外部变量作用域。
注意事项
$sb_1 += { echo 2 } 会失败,因为 ScriptBlock 没有实现 op_Addition。如果通过字符串拼接脚本文本,再用 [scriptblock]::Create() 创建脚本块,就需要自行处理引号、变量展开和作用域等问题。这里用包装脚本块或传递参数即可满足需求。
备注:内容仅供参考。
