【问题标题】:Inno Setup Iterate over [Files] section in Pascal codeInno Setup 迭代 Pascal 代码中的 [Files] 部分
【发布时间】:2016-03-07 19:23:00
【问题描述】:

在 Inno Setup 脚本中,我需要将多个文件复制到多个用户定义的位置。为了做到这一点,我想根据用户定义的文件设置和属性对[Files] 部分中的源和FileCopy() 进行多次迭代。

是否可以使用脚本访问[Files] 部分中的源代码?

【问题讨论】:

    标签: loops inno-setup pascalscript


    【解决方案1】:

    不,您不能迭代 [Files] 部分。


    但是您可以使用预处理器从一个文件列表中生成[Files] 部分和Pascal 脚本。

    你的目标不是很具体,所以我只展示一个粗略的概念。

    ; Define array of files to work with
    #dim Files[2]
    #define Files[0] "MyProg.exe"
    #define Files[1] "MyProg.chm"
    
    #define I
    
    ; Iterate the file array, generating one entry in Run section for each file    
    [Files]
    #sub FileEntry
    Source: "{#Files[I]}"; DestDir: "{app}"
    #endsub
    
    #for {I = 0; I < DimOf(Files); I++} FileEntry
    
    
    [Code]
    
    procedure CopyFiles;
    begin
      // Iterate the file array, generating two FileCopy calls for each file    
    #sub FileCopy
      FileCopy('{#Files[I]}', 'd:\destination1\{#Files[I]}', True);
      FileCopy('{#Files[I]}', 'd:\destination2\{#Files[I]}', True);
    #endsub
    
    #for {I = 0; I < DimOf(Files); I++} FileCopy
    end;
    
    // Just for debugging purposes, outputs the preprocessed script
    // so you can verify if the code generation went right
    #expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
    

    如果你编译脚本,你可以在预处理文件Preprocessed.iss 中看到它生成了这个:

    [Files]
    Source: "MyProg.exe"; DestDir: "{app}"
    Source: "MyProg.chm"; DestDir: "{app}"
    
    [Code]
    procedure CopyFiles;
    begin
      FileCopy('MyProg.exe', 'd:\destination1\MyProg.exe', True);
      FileCopy('MyProg.exe', 'd:\destination2\MyProg.exe', True);
      FileCopy('MyProg.chm', 'd:\destination1\MyProg.chm', True);
      FileCopy('MyProg.chm', 'd:\destination2\MyProg.chm', True);
    end;
    

    实际上,您可能不需要为此特定目的使用FileCopy。您可以让预处理器为同一个文件生成多个 [Files] 部分条目:

    ; Iterate the file array, generating one entry in Run section for each file    
    [Files]
    #sub FileEntry
    Source: "{#Files[I]}"; DestDir: "{app}"
    Source: "{#Files[I]}"; DestDir: "d:\destination1"
    Source: "{#Files[I]}"; DestDir: "d:\destination2"
    #endsub
    

    生成:

    [Files]
    Source: "MyProg.exe"; DestDir: "{app}"
    Source: "MyProg.exe"; DestDir: "d:\destination1"
    Source: "MyProg.exe"; DestDir: "d:\destination2"
    Source: "MyProg.chm"; DestDir: "{app}"
    Source: "MyProg.chm"; DestDir: "d:\destination1"
    Source: "MyProg.chm"; DestDir: "d:\destination2"
    

    Inno Setup 将识别相同的源文件并且只打包一次。

    您可以使用Check parameter 使某些条目有条件。


    另请参阅这个问题,实际上是相似的:
    Access file list via script in InnoSetup

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2016-06-23
      • 2016-05-17
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多