NSIS递归文件日志

时间:2011-12-07 20:27:30

标签: nsis

短篇小说

大家好,

有没有办法在编译时以递归方式运行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实现这一目标?)。

提前致谢。

亲切的问候

2 个答案:

答案 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

它允许您使用“文件”功能的递归功能,并为您生成卸载日志。