在函数或宏内部,我经常需要特定的 SetOverwrite 行为。但是,我更喜欢让这些子程序自行清理(不在堆栈上留下非返回值,保持 OutPath 相同,不改变全局状态等),这样我就不必复制设置流每次我想做某事时都会输入命令,以保持代码更具可读性。
有没有办法用
SetOverwrite
来完成这个任务?我可以“检测”它、保存它并以某种方式恢复它吗?
我看不到
GetOverwrite
功能。 SetOverwrite 文档提到了“覆盖标志”,尽管我找不到具体的参考资料。有没有办法获取这个(或任意)标志的值?
不,没有可以与之交互的旗帜。有一组可以通过插件控制的标志,但覆盖模式不是其中之一。
我认为覆盖模式与
File
指令交互,因此有一些编译时限制。
你唯一能做的就是
${If} $something = "whatever"
SetOverwrite on
${Else}
SetOverwrite ifnewer
${EndIf}
File "foo.txt"
SetOverwrite
适用于脚本后面的所有其他 File
指令,因此遗憾的是无法推送/弹出其状态。
来自文档:
4.8.2 编译器标志
以下命令影响编译器生成代码和压缩数据的方式。除非另有说明,否则这些命令在脚本中的任何位置都有效,并影响每个命令所在位置下面的每一行(直到被另一个命令覆盖)。使用流量控制指令无法跳过它们。
您无法将标志的当前状态保存在变量中,但
SetOverwrite
允许您使用lastused
作为参数,这会恢复最后一个SetOverwrite
之前使用的标志的值。所以你不能递归地保存标志,但你可以在File
之前将其设置为临时并在之后恢复它:
${If} $something = "whatever"
SetOverwrite on
${Else}
SetOverwrite ifnewer
${EndIf}
File "foo.txt"
SetOverwrite lastused