NSIS递归文件日志 短篇小说

NSIS递归文件日志 短篇小说,nsis,Nsis,大家好 有没有一种方法可以在编译时使用NSIS递归地遍历目录 谢谢 长话短说 大家好 我正在尝试使用NSIS为我正在开发的软件创建一个安装程序。我们安装的构建系统会创建一个文件夹,其中包含在Windows上运行该软件所需的所有内容(DLL、EXE、图像、库、示例等)。该文件夹有+400个文件和文件夹。使用HM NIS Edit,可以生成安装所有内容所需的“文件”和“设置输出路径”序列,但这是一个巨大、丑陋的过程,如果添加或删除了一些文件,我们必须手动更改脚本 所以。。。我们删除了生成的“Fil

大家好

有没有一种方法可以在编译时使用NSIS递归地遍历目录

谢谢


长话短说 大家好

我正在尝试使用NSIS为我正在开发的软件创建一个安装程序。我们安装的构建系统会创建一个文件夹,其中包含在Windows上运行该软件所需的所有内容(DLL、EXE、图像、库、示例等)。该文件夹有+400个文件和文件夹。使用HM NIS Edit,可以生成安装所有内容所需的“文件”和“设置输出路径”序列,但这是一个巨大、丑陋的过程,如果添加或删除了一些文件,我们必须手动更改脚本

所以。。。我们删除了生成的“File”和“SetOutPath”序列,只添加了:

File /r "C:\path\to\output\dir"
它工作得很好。。。但现在卸载程序出现问题,因为我们无法执行此操作:

RMDir /r $INSTDIR
因为是危险的(如此处所述:)

因此,我们尝试实施其中给出的建议:

该解决方案创建一个日志,NSIS在其中写入所有“文件”和“设置输出路径”操作,以便在卸载时回退(删除)。问题是包含的宏不支持“File”的递归选项

我试图通过递归地遍历文件夹来实现递归版本,但我认为我做得不对(好吧,我很确定:p):

用这个 但我认为这只能在安装时起作用

到目前为止,我找到的解决方案是使用NSIS文件作为模板(带有“file”和“SetOutPath”列表的占位符标记)创建安装程序脚本,一个Python脚本在输出目录上运行,创建所需的“file”和“SetOutPath”序列,然后编写最终的NSIS脚本。。。但是我真的不喜欢它:S

所以我的问题是:

有没有一种方法可以在编译时使用NSIS递归地遍历目录

(或者,我如何仅通过NSIS实现这一点?)

提前谢谢

问候

!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
这个用!系统生成静默安装程序,当执行此静默安装程序时,它会使用File和Delete命令生成文本文件,这是真正的安装程序脚本!包括这些以执行安装/卸载命令


你可以用!系统可以执行任何操作,包括批处理文件、windows脚本主机、python等。

您的做法是正确的

请改用这组脚本

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

!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