Inno setup 通过InnoSetup中的脚本访问文件列表

Inno setup 通过InnoSetup中的脚本访问文件列表,inno-setup,pascalscript,Inno Setup,Pascalscript,运行安装程序时,是否有办法从PascalScript访问文件列表(在[files]部分中的条目)?我们正试图使应用程序直接从安装程序运行,而不是必须安装它,这将使维护文件列表更容易。这里的想法是将文件名存储到单独的文本文件(这里是Source.txt)中,其中每一行都是一个文件。然后,预处理器将为您生成脚本。实际上,它创建了一个数组,其中包含来自Source.txt的文件列表,并将其所有元素添加到[files]部分,在[code]部分,它将填充字符串列表(这里使用一个列表框来显示内容) 重要提示

运行安装程序时,是否有办法从PascalScript访问文件列表(在[files]部分中的条目)?我们正试图使应用程序直接从安装程序运行,而不是必须安装它,这将使维护文件列表更容易。

这里的想法是将文件名存储到单独的文本文件(这里是
Source.txt
)中,其中每一行都是一个文件。然后,预处理器将为您生成脚本。实际上,它创建了一个数组,其中包含来自
Source.txt
的文件列表,并将其所有元素添加到
[files]
部分,在
[code]
部分,它将填充字符串列表(这里使用一个列表框来显示内容)

重要提示:

Source.txt
文件的末尾必须有一个额外的非空行,因此只需添加例如
位于文件末尾

脚本:

测试预处理脚本的输出。iss:


您应该澄清您的问题,但如果我理解正确,您希望在运行时从安装程序中提取文件以运行它们-如果是这样,请查看
ExtractTemporaryFile()
helper函数。但是,如果您无法访问文件列表,则必须对所需文件的提取进行硬编码。@mghie:是的,我们使用的是ExtractTemporaryFile(该函数还遇到了其他问题,例如无法将多个同名文件提取到不同的目录中),但到目前为止,我们硬编码要提取到脚本中的文件列表,因此在更改列表时需要维护两个位置。很遗憾,无法从脚本访问列表。您是要使用通配符添加目录中的文件还是单个文件列表中的文件?在后一种情况下,可以在单个文本文件中包含文件列表,并将其添加到“文件”部分,以及使用InnoSetup预处理器在代码部分中填充字符串列表。@TLama:不,问题是该应用程序要么由InnoSetup安装,要么直接从安装程序运行。对于后者,我们目前必须维护一个单独的文件列表以临时提取。如果我可以读取安装程序的实际文件列表并从中提取,那就更容易了。当然,将文件列表放在一个单独的文件中并生成文件部分和提取代码可能是一个有趣的想法。你会如何使用预处理器?@TLama:对不起,项目已经结束很久了,所以我没有真正尝试过。不过,我会看看您的答案,因为这可能在另一个项目中派上用场,因为出于某种原因,同一个客户再次需要一个可执行的应用程序……:)这个主意听起来不错。我不知道你可以用预处理器做这件事。看起来很像基本的。。。
#define FilesSource "d:\Source.txt"
#define FileLine
#define FileIndex
#define FileCount
#define FileHandle
#dim FileList[65536]
#sub ProcessFileLine
  #if FileLine != ""
    #expr FileList[FileCount] = FileLine
    #expr FileCount = ++FileCount
  #endif  
#endsub
#for {FileHandle = FileOpen(FilesSource); \
  FileHandle && !FileEof(FileHandle); \
  FileLine = FileRead(FileHandle)} \
  ProcessFileLine
#if FileHandle
  #expr FileClose(FileHandle)
#endif
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
#sub AddFileItem
  #emit 'Source: "' + FileList[FileIndex] + '"; DestDir: "{app}"'
#endsub
#for {FileIndex = 0; FileIndex < FileCount; FileIndex++} AddFileItem

[Code]
procedure InitializeWizard;
var  
  FileList: TStringList;
  FileListBox: TListBox;
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Theme selection page', '');

  FileListBox := TListBox.Create(WizardForm);
  FileListBox.Parent := CustomPage.Surface;
  FileListBox.Align := alClient;

  FileList := TStringList.Create;
  try
    #sub AddFileItemCode
      #emit '    FileList.Add(''' + FileList[FileIndex] + ''');'
    #endsub
    #for {FileIndex = 0; FileIndex < FileCount; FileIndex++} AddFileItemCode
    FileListBox.Items.Assign(FileList);
  finally
    FileList.Free;
  end;  
end;

#expr SaveToFile("d:\PreprocessedScript.iss")
MyProg.exe
MyProg.chm
Readme.txt
;
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"

[Code]
procedure InitializeWizard;
var  
  FileList: TStringList;
  FileListBox: TListBox;
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Theme selection page', '');

  FileListBox := TListBox.Create(WizardForm);
  FileListBox.Parent := CustomPage.Surface;
  FileListBox.Align := alClient;

  FileList := TStringList.Create;
  try
    FileList.Add('MyProg.exe');
    FileList.Add('MyProg.chm');
    FileList.Add('Readme.txt');
    FileListBox.Items.Assign(FileList);
  finally
    FileList.Free;
  end;  
end;