NSIS节隐藏(编译和执行)

NSIS节隐藏(编译和执行),nsis,Nsis,我找到了一些关于nsis部分隐藏的论坛主题,也查看了nsis帮助,但找不到我的答案。我想要一件简单的事情,即根据我的要求,我想要完全隐藏一个部分,而不注释整行代码 现在,这将影响两件事 节应该从编译范围中删除,就像我注释了这些行一样。 不要执行安装程序中的章节代码。 如果在节名称之前使用,/o或-。这是第二点。但是有什么方法可以实现第一种方法吗?您可以使用条件编译: !define INCLUDESECTION !ifdef INCLUDESECTION Section "section1"

我找到了一些关于nsis部分隐藏的论坛主题,也查看了nsis帮助,但找不到我的答案。我想要一件简单的事情,即根据我的要求,我想要完全隐藏一个部分,而不注释整行代码

现在,这将影响两件事

节应该从编译范围中删除,就像我注释了这些行一样。 不要执行安装程序中的章节代码。
如果在节名称之前使用,/o或-。这是第二点。但是有什么方法可以实现第一种方法吗?

您可以使用条件编译:

!define INCLUDESECTION

!ifdef INCLUDESECTION
Section "section1"
   ...
SectionEnd
!endif
您还可以从命令行决定是否包含该节:

makensis.exe /DINCLUDESECTION example.nsi

在这种情况下,您不必在nsis代码中定义INCLUDESECTION。

在编译时禁用节以避免其选择/执行是个坏主意,因为:

设计的部分都是关于代码运行时行为的,而不是关于编译时的。否则,它会产生一个无限的集合!如果。。。!endif用于区段范围控制和bloatware编译定义,如您的INCLUDESECTION。 在某个时刻,您可能希望在运行时切换节选择/可见性,这将迫使您混合运行时代码和编译时代码,这会更糟糕。 我可能认为这一切都源于运行时对节选择/隐藏行为的无效理解。因此,为了确保在运行时使用节选择/隐藏不会有太多问题,您必须了解以下几点:

在Windows部分中,通过SysTreeView32控件实现,并继承/解决此类控件引入的所有问题。这意味着您必须在Page Pre-OnCreate函数中隐藏/取消隐藏节控件项,而不是Page Show OnShow函数,该函数基本上用于控制节的可见性状态。 部分即使隐藏也可以运行,因为隐藏状态独立于选择状态。要隐藏节,当选择状态由相应的控制项标志引入时,必须将空字符串设置为节名称。因此,在某些情况下,您可能必须在节代码块处测试节隐藏性,以跳过它的进一步执行。 父节选择通过控件递归触发子节选择。但由于隐藏的非只读子节也会选择,因此您必须在.onSelChange处理程序函数结束时手动从部分选中/全部选中/全部未选中更新父选择状态,以修复控件复选框对其实际外观的可见性。 因此,要把所有事情做好,你必须:

编写UpdateSectionGroupSelectionN宏集以对每个节组可见性状态更新进行后处理,其中N-是节中的子项数。如果选择了节中所有未隐藏的子项,则必须将父项更新为“全部选定”状态。如果选择了节中的某些未隐藏子项,则必须将父项更新为部分选定状态。如果所有子项都是隐藏的,那么您必须决定与这些父项相关的可能是,它甚至不应该更改,或者必须在Page Pre函数中隐藏。 添加到节隐藏状态检查代码,以在其他节邻居可能被隐藏或其他原因的情况下绕过节进一步执行。
我知道大家都说这有点棘手,但您会发现,这种方法几乎是一种常见的方法,可以一次性解决所有部分问题,并避免代码进一步复杂化。

是的,这是一种很好的方法。但是没有内置的命令开关来跳过隐藏节编译。我说得对吗?隐藏部分是指在“组件”页面上未向用户显示的部分。它不是一个已禁用或不活动的节,因此在运行时执行一个隐藏节,因此必须对其进行编译。好的。所以隐藏意味着只跳过用户视图。“SectionIn”命令怎么样?在上找到一些帖子:。SectionIn选择节所属的安装类型。