大家好,
有没有办法在编译时以递归方式运行NSIS目录?
由于
大家好,
我正在尝试使用NSIS为我正在开发的软件创建一个安装程序。我们设置的构建系统创建了一个文件夹,其中包含在Windows上运行该软件所需的一切(dll,exes,图像,库,示例等)。该文件夹有+400个文件和文件夹。使用HM NIS Edit,可以生成安装所有内容所需的“文件”和“SetOutPath”序列,但是只是庞大,丑陋,如果添加或删除某些文件,我们必须手动更改脚本。 / p>
所以......我们删除了生成的“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实现这一目标?)。
提前致谢。
亲切的问候
答案 0 :(得分:3)
!ifdef GENFILELIST
outfile "${GENFILELIST}.exe"
requestexecutionlevel user
silentinstall silent
Var ins
Var uns
Function ProcessDir
Pop $R1 ;reldir
Pop $R0 ;absdir
Push $0
Push $1
FileWrite $ins 'Push $$Outdir$\n'
FileWrite $ins 'SetOutPath "$$instdir\$R1"$\n'
FindFirst $0 $1 "$R0\*"
loop:
StrCmp "" $1 done
StrCmp "." $1 next
StrCmp ".." $1 next
IfFileExists "$R0\$1\*.*" 0 processfile
Push $R0
Push $R1
Push "$R0\$1"
Push "$R1$1\"
call ProcessDir
Pop $R1
Pop $R0
goto next
processfile:
FileWrite $ins 'File "${SRCDIR}\$R1$1"$\n'
FileWrite $uns 'Delete "$$instdir\$R1$1"$\n'
next:
FindNext $0 $1
Goto loop
done:
FindClose $0
FileWrite $uns 'RMDir "$$instdir\$R1"$\n'
FileWrite $ins 'Pop $$Outdir$\n'
Pop $1
Pop $0
FunctionEnd
section
FileOpen $ins "${GENFILELIST}ins" w
FileOpen $uns "${GENFILELIST}uns" w
Push "${SRCDIR}"
Push ""
call ProcessDir
sectionend
!else
!tempfile FILELIST
!system '"${NSISDIR}\makensis" -NOCD "-DGENFILELIST=${FILELIST}" "-DSRCDIR=.\myfiles" "${__FILE__}"' = 0
!system '"${FILELIST}.exe"' = 0
!delfile "${FILELIST}"
!delfile "${FILELIST}.exe"
### Main script starts here ###
outfile test.exe
page directory
page instfiles
section
SetOutPath $instdir
WriteUninstaller "$instdir\uninst.exe"
!include "${FILELIST}ins"
!delfile "${FILELIST}ins"
sectionend
section uninstall
!include "${FILELIST}uns"
!delfile "${FILELIST}uns"
Delete "$instdir\uninst.exe"
RMDir "$instdir"
sectionend
!endif
这使用!系统生成静默安装程序,当执行此静默安装程序时,它会生成带有文件和删除命令的文本文件,真正的安装程序脚本!包含这些以执行安装/卸载命令。
您可以使用!system执行任何操作,批处理文件,Windows脚本主机,python等。
答案 1 :(得分:0)
你走在正确的轨道上。
请改用这组脚本。
http://nsis.sourceforge.net/Advanced_Uninstall_Log_NSIS_Header
它允许您使用“文件”功能的递归功能,并为您生成卸载日志。