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

时间:2011-05-19 22:05:56

标签: zip inno-setup unzip

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

我在Inno Setup website查看了文档,常见问题解答和知识库,除了编写Pascal脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代方案溶液

5 个答案:

答案 0 :(得分:22)

您可以使用外部命令行工具解压缩档案,例如,请参阅here。把它放在你的[文件]部分:

[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall

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

[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"

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

答案 1 :(得分:8)

您可以使用shell Folder.CopyHere method来提取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;

请注意,标记SHCONTCH_NOPROGRESSBOXSHCONTCH_RESPONDYESTOALL适用于Windows Vista及更高版本。

有关仅提取某些文件的示例,请参阅:
How to get Inno Setup to unzip a single file?

答案 2 :(得分:7)

我回答了非常similar question,其中一些细节也适用。

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

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

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

更新

默认情况下,放置在setup.exe中的文件为compressed

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

[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;

答案 3 :(得分:0)

您可以只创建静默的自解压存档(SFX)存档,在此处how to create SFX archive中描述所需示例,并编写Pascal代码以使其运行(Inno Setup 6.0.2的脚本):

[Tasks]
Name: "intallSenselockDriver"; Description: "Install Senselock driver."; GroupDescription: "Install the necessary software:";

[Code]
function ExecTmpFile(FileName: String): Boolean;
var
  ResultCode: Integer;
begin
  if not Exec(ExpandConstant('{tmp}\' + FileName), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
  then
    begin
      MsgBox('Other installer failed to run!' + #13#10 + SysErrorMessage(ResultCode), mbError, MB_OK);
      Result := False;
    end
  else
    Result := True;
end;

procedure RunOtherInstallerSFX(ArchiveName: String; ExePath: String);
begin
  ExtractTemporaryFile(ArchiveName);
  ExecTmpFile(ArchiveName);
  ExecTmpFile(ExePath);
end;

function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
  if WizardIsTaskSelected('intallSenselockDriver') then
    RunOtherInstallerSFX('1_senselock_windows_3.1.0.0.exe', '1_senselock_windows_3.1.0.0\InstWiz3.exe');

  Result := '';
end;

对我来说效果很好。

答案 4 :(得分:-1)

使用双引号对我有用。 单引号无效。

[Files]
Source: "unzip.exe"; DestDir: "{userappdata}\{#MyAppName}\{#InputFolderName}"; Flags: ignoreversion 

[Run]
Filename: "{userappdata}\{#MyAppName}\{#InputFolderName}\unzip.exe"; Parameters: " ""{userappdata}\{#MyAppName}\{#InputFolderName}\ZIPFILENAME.zip""  -d  ""{userappdata}\{#MyAppName}\{#InputFolderName}""  ";  Flags: runascurrentuser