【问题标题】:NSIS - how to recursively include all files only from source folder and subfolders?NSIS - 如何递归地仅包含源文件夹和子文件夹中的所有文件?
【发布时间】:2016-04-05 21:19:21
【问题描述】:

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

File /r "parentdir\*.*"

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

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

我拥有的是:

<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\*.*"

我得到了我想要的。但是

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

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

谢谢!

【问题讨论】:

    标签: nsis


    【解决方案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
    

    【讨论】:

    • 哇,它有效!我已经与我的主要代码分开尝试过。它看起来很棒。我会尝试将它应用到我的主脚本中。有趣的是我已经使用这种“方式”来解决我的主要代码中的另一个问题。现在我的脚本看起来很复杂,我什至不知道如何正确应用您的解决方案,但我会尝试一下。非常感谢!
    猜你喜欢
    • 2016-08-10
    • 2012-02-22
    • 2011-04-14
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多