PAYATHON 2026

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() 创建脚本块,就需要自行处理引号、变量展开和作用域等问题。这里用包装脚本块或传递参数即可满足需求。

备注:内容仅供参考。