根据命令行参数在安装期间跳过文件

Skip files during installation depending on command line argument

我目前的方案是,我希望用户能够跳过安装用户可能在安装时通过命令行参数指定的某些文件。

这个想法是让用户指定一个文本文件,理想情况下,在安装过程中,安装程序会检查当前正在复制的文件是否列在提供的文本文件中,并据此做出决定。

我的 [Files] 部分 atm 引用了完整目录:最好的方法是单独列出所有文件并使用 Check 参数,还是有其他方法可用?似乎没有适合此任务的事件函数。

谢谢 马库斯

无需单独列出所有文件。即使 Source 是通配符,也会为每个文件单独调用 Check function

使用 CurrentFilename function 来判断当前正在处理的文件。

请注意,Check 函数会为每个文件调用多次。

[Files]
Source: "C:\path\*.*"; DestDir: "{app}"; Check: AllowFile
[Code]

var
  Whitelist: TStringList;

function AllowFile: boolean;
var
  FileName: string;
begin
  FileName := ExtractFileName(ExpandConstant(CurrentFileName));
  Result := (Whitelist = nil) or (Whitelist.IndexOf(Uppercase(FileName)) >= 0);
  if Result then
    Log(Format('Allowing "%s"', [FileName]))
  else
    Log(Format('Skipping "%s"', [FileName]));
end;

function InitializeSetup(): Boolean;
var
  WhitelistFile: string;
  Lines: TArrayOfString;
  I: Integer;
begin
  WhitelistFile := ExpandConstant('{param:Whitelist}');
  if WhitelistFile = '' then
  begin
    Log('No whitelist specified, allowing all files');
  end
    else
  begin
    Whitelist := TStringList.Create;
    Whitelist.Sorted := True;
    LoadStringsFromFile(WhitelistFile, Lines);
    for I := 0 to GetArrayLength(Lines) - 1 do
      Whitelist.Add(Uppercase(Lines[I]));
    Log(Format('Loaded %d entries to whitelist from "%s"', [
      Whitelist.Count, WhitelistFile]));
  end;
  Result := True;
end;