我可以在 NSIS 中推送/弹出 SetOverwrite 标志的值吗?

问题描述 投票:0回答:2

在函数或宏内部,我经常需要特定的 SetOverwrite 行为。但是,我更喜欢让这些子程序自行清理(不在堆栈上留下非返回值,保持 OutPath 相同,不改变全局状态等),这样我就不必复制设置流每次我想做某事时都会输入命令,以保持代码更具可读性。

有没有办法用

SetOverwrite
来完成这个任务?我可以“检测”它、保存它并以某种方式恢复它吗?

我看不到

GetOverwrite
功能。 SetOverwrite 文档提到了“覆盖标志”,尽管我找不到具体的参考资料。有没有办法获取这个(或任意)标志的值?

nsis
2个回答
1
投票

不,没有可以与之交互的旗帜。有一组可以通过插件控制的标志,但覆盖模式不是其中之一。

我认为覆盖模式与

File
指令交互,因此有一些编译时限制。

你唯一能做的就是

${If} $something = "whatever"
  SetOverwrite on
${Else}
  SetOverwrite ifnewer
${EndIf}

File "foo.txt"

SetOverwrite
适用于脚本后面的所有其他
File
指令,因此遗憾的是无法推送/弹出其状态。

来自文档:

4.8.2 编译器标志

以下命令影响编译器生成代码和压缩数据的方式。除非另有说明,否则这些命令在脚本中的任何位置都有效,并影响每个命令所在位置下面的每一行(直到被另一个命令覆盖)。使用流量控制指令无法跳过它们。


0
投票

您无法将标志的当前状态保存在变量中,但

SetOverwrite
允许您使用
lastused
作为参数,这会恢复最后一个
SetOverwrite
之前使用的标志的值。所以你不能递归地保存标志,但你可以在
File
之前将其设置为临时并在之后恢复它:

${If} $something = "whatever"
  SetOverwrite on
${Else}
  SetOverwrite ifnewer
${EndIf}

File "foo.txt"

SetOverwrite lastused
© www.soinside.com 2019 - 2024. All rights reserved.