NSIS - 如何以递归方式包含源文件夹和子文件夹中的所有文件?

时间:2016-04-05 21:19:21

标签: nsis

大家。我试图将一些带有文件的“parentdir”包含在我的安装程序中。问题是:我使用/ r参数来包含所有文件和文件夹,如下所示:

File /r "parentdir\*.*"

此命令包括所有文件和子文件夹。

是否有机会仅将所有子文件夹(例如下面的文件)中的文件包含在目录中?

我拥有的是:

<dir>parentdir
  file1.txt
  file2.txt
  <dir> directory1
       file3.txt
       file4.txt
  <dir> directory2
       file5.txt
       file6.txt
       <dir> directory3
             file6.txt

我想在OUT目录中获得的是:

<dir>parentdir
  file1.txt
  file2.txt
  file3.txt
  file4.txt
  file5.txt
  file6.txt
  file6.txt

我已经尝试过这样做:

SetOutPath "$INSTDIR\parentdir"
File "parentdir\directory1\*.*"
File "parentdir\directory2\*.*"
File "parentdir\directory2\directory3\*.*"

我得到了我想要的东西。但是

有没有机会不使用子文件夹的名称?如果脚本不知道所有子文件夹的确切名称(如果要添加新的子文件夹),我需要它。

我可以让我的安装程序灵活吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以创建搜索磁盘并将File指令写入.nsh文件的批处理文件(或任何其他程序)。您的.nsi将首先使用!system执行生成.nsh的外部应用程序,然后使用!include

Section
SetOutPath "$INSTDIR\parentdir"
!tempfile filelist
!system '"generatefilelist.bat" ".\parentdir" "${filelist}"'
!include "${filelist}"
!delfile "${filelist}"
SectionEnd

...批处理文件可能如下所示:

@echo off
FOR /R "%~1" %%A IN (*.txt) DO (
    >> "%~2" echo.File "%%~A"
)

如果模式足够简单,您不需要单独的批处理文件,您可以直接使用cmd.exe:

Section
SetOutPath "$INSTDIR\parentdir"
!tempfile filelist
!system 'FOR /R ".\parentdir" %A IN (*.txt) DO @( >> "${filelist}" echo.File "%~A" )'
!include "${filelist}"
!delfile "${filelist}"
SectionEnd