首页 文章

NSIS递归文件日志

提问于
浏览
4

短篇小说

大家好,

有没有办法在编译时以递归方式运行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 回答

  • 0
    !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等 .

  • 3

    你走在正确的轨道上 .

    请改用这组脚本 .

    http://nsis.sourceforge.net/Advanced_Uninstall_Log_NSIS_Header

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

相关问题