如何让Inno Setup解压缩它安装的文件(所有这些都作为一个安装过程的一部分)

Dan*_*nas 17 zip inno-setup unzip

为了节省带宽/空间以及防止意外干扰,数据库产品的安装文件(称之为Ajax)已被压缩(调用该文件"AJAX_Install_Files.ZIP).我想让Inno-Setup"安装" (即,复制)AJAX_Install_Files.ZIP文件到目标,然后将文件解压缩到.ZIP文件所在的同一文件夹中.后续程序将由Inno安装程序启动以实际运行产品安装"Ajax ".

我查看了Inno Setup网站上的文档,FAQ和KB,除了编写Pascal脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代解决方案?

Tre*_*reb 25

您可以使用外部命令行工具来解压缩存档,例如,请参阅此处.把它放在你的[Files]部分:

[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall
Run Code Online (Sandbox Code Playgroud)

然后在[Run]部分中调用它,如下所示:

[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"
Run Code Online (Sandbox Code Playgroud)

(您可能希望从脚本变量中获取目标目录,因此还需要完成一些工作)

  • @TalyssondeCastro使用`Flags:runhidden`。 (2认同)
  • 正确,但我需要在 .zip 和目标目录周围添加引号。为此,您必须使用另一组引号进行转义,使其看起来像: """{tmp}\ZipFile.ZIP"" -d ""C:\TargetDir""" (2认同)

Rob*_*ove 9

我回答了一个非常相似的问题,其中一些细节也适用.

我会问为什么你需要一个内容的ZIP文件?我个人会将未压缩的文件放入设置中.然后,我将有两个[category]用于应用程序的条目和一个用于数据的条目.默认情况下都要检查.

这将允许用户在以后需要时安装一组新数据.

如果你真的想要一个ZIP文件,并希望保持简单,你可以在同一设置中发送zip文件和未压缩文件.

更新:

默认情况下,压缩安装在setup.exe中的文件.

您还可以将文件解压缩到临时位置,以便运行安装应用程序,然后删除它们.

[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Run Code Online (Sandbox Code Playgroud)

  • 为什么是内容的拉链 - 因为这是文件提供给我的方式,我认为处理单个.ZIP文件比在.ZIP文件中保存的2000多个文件更容易*.这个.ZIP文件是我试图自动化的多程序安装的一个程序的安装和数据.一旦我将文件"安装"(实际复制)到目标机器,我就会启动数据库安装程序并使用另一个自动化工具自动安装它.所以最终,我需要重复上述过程很多次(> 2次). (3认同)

Mar*_*ryl 9

您可以使用shell Folder.CopyHere方法提取ZIP.

const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;

procedure UnZip(ZipPath, TargetPath: string); 
var
  Shell: Variant;
  ZipFile: Variant;
  TargetFolder: Variant;
begin
  Shell := CreateOleObject('Shell.Application');

  ZipFile := Shell.NameSpace(ZipPath);
  if VarIsClear(ZipFile) then
    RaiseException(Format('ZIP file "%s" does not exist or cannot be opened', [ZipPath]));

  TargetFolder := Shell.NameSpace(TargetPath);
  if VarIsClear(TargetFolder) then
    RaiseException(Format('Target path "%s" does not exist', [TargetPath]));

  TargetFolder.CopyHere(ZipFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;
Run Code Online (Sandbox Code Playgroud)

请注意,标志SHCONTCH_NOPROGRESSBOXSHCONTCH_RESPONDYESTOALLWindows Vista和更新版本的工作.


有关仅提取某些文件的示例,请参阅:
如何让Inno Setup解压缩单个文件?

  • 很流畅,但如果 zip 文件很大,则会锁定 UI。不过,该脚本可以打包为 .ps1 文件,并以与此示例启动 7zip 相同的方式启动:https://gist.github.com/jakoch/33ac13800c17eddb2dd4 (2认同)