短篇小说
大家好,
有没有办法在编译时以递归方式运行NSIS目录?
谢谢
长篇故事
大家好,
我正在尝试使用NSIS为我正在开发的软件创建一个安装程序 . 我们设置的构建系统创建了一个文件夹,其中包含在Windows上运行该软件所需的一切(dll,exes,图像,库,示例等) . 该文件夹有400个文件和文件夹 . 使用HM NIS Edit,可以生成安装所有内容所需的“文件”和“SetOutPath”序列,但这只是巨大的,丑陋的,如果添加或删除某些文件,我们必须手动更改脚本 .
所以......我们删除了生成的“File”和“SetOutPath”序列,并添加了:
File /r "C:\path\to\output\dir"
它工作得很好......但是现在我们遇到了卸载程序的问题,因为我们不能这样做:
RMDir /r $INSTDIR
因为是危险的(如此处所述:http://nsis.sourceforge.net/Docs/Chapter4.html#4.9.1.8) .
所以,我们试图实施那里给出的建议:http://nsis.sourceforge.net/Uninstall_only_installed_files
该解决方案创建了一个登录,NSIS写入了所有“File”和“SetOutPath”操作,因此它可以在卸载时回退(删除) . 问题是包含的宏不支持“File”的递归选项 .
我试图通过递归遍历文件夹来实现递归版本,但我认为我做错了(好吧,我很确定:P):
!include "RecFind.nsh"
Section "Principal" SEC01
${SetOutPath} "$INSTDIR"
SetOverwrite try
${RecFindOpen} "..\executable" $R0 $R1
DetailPrint "Looking into directory: $R0"
${SetOutPath} "$R0"
${RecFindFirst}
DetailPrint "Looking file: $R0\$R1"
${File} "$R0" "$R1"
${RecFindNext}
${RecFindClose}
使用这个http://nsis.sourceforge.net/RecFind:_Recursive_FindFirst,_FindNext,_FindClose但我认为只能在安装时工作 .
我到目前为止找到的解决方案是创建安装程序脚本,其中NSIS文件用作模板(带有“File”和“SetOutPath”列表的一些占位符标记),一个Python脚本,它在输出目录上行走并创建需要“File”和“SetOutPath”的序列,然后编写最终的NSIS脚本......但我真的不喜欢它:S
所以我的问题是:
有没有办法在编译时以递归方式运行NSIS目录?
(或者,我如何才能通过NSIS实现这一目标?) .
提前致谢 .
亲切的问候
2 回答
这使用!系统生成静默安装程序,当执行此静默安装程序时,它会生成带有文件和删除命令的文本文件,真正的安装程序脚本!包含这些以执行安装/卸载命令 .
您可以使用!system执行任何操作,批处理文件,Windows脚本主机,python等 .
你走在正确的轨道上 .
请改用这组脚本 .
http://nsis.sourceforge.net/Advanced_Uninstall_Log_NSIS_Header
它允许您使用“文件”功能的递归功能,并为您生成卸载日志 .