gpt4 book ai didi

NSIS 递归文件日志

转载 作者:行者123 更新时间:2023-12-03 06:20:42 24 4
gpt4 key购买 nike

短篇小说

大家好,

有没有办法在编译时使用 NSIS 递归地遍历目录?

谢谢

<小时/>

长话短说

大家好,

我正在尝试使用 NSIS 为我正在开发的软件创建安装程序。我们设置的构建系统会创建一个文件夹,其中包含在 Windows 上运行该软件所需的所有内容(dll、exe、图像、库、示例等)。该文件夹有超过 400 个文件和文件夹。使用 HM NIS Edit 可以生成安装所有内容所需的“File”和“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 来实现这一目标?)。

提前致谢。

亲切的问候

最佳答案

!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 生成静默安装程序,当执行此静默安装程序时,它会生成带有文件和删除命令的文本文件,真正的安装程序脚本 !include 是用来执行安装/卸载命令的。

您可以使用 !system 执行任何内容,批处理文件、Windows 脚本主机、Python 等。

关于NSIS 递归文件日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com