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

问题描述 投票:0回答:5

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

我已经浏览了 Inno Setup 网站 上的文档、常见问题解答和知识库,除了编写 Pascal 脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代解决方案?

zip inno-setup unzip
5个回答
27
投票

您可以使用外部命令行工具来解压缩存档,例如,请参阅here。将其放入您的[文件]部分:

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

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

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

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


14
投票

您可以使用 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;

请注意,标志

SHCONTCH_NOPROGRESSBOX
SHCONTCH_RESPONDYESTOALL
适用于 Windows Vista 及更高版本。


您可以像这样使用该功能:

[Files]
Source: "archive.zip"; DestDir: "{tmp}"; AfterInstall: UnZipCurrentFileTo('{app}')

将此辅助功能放在下方

UnZip
:

procedure UnZipCurrentFileTo(TargetPath: string);
begin
  UnZip(ExpandConstant(CurrentFileName), ExpandConstant(TargetPath));
end;

如果您只使用一次,您可以这样做:

[Files]
Source: "archive.zip"; DestDir: "{tmp}"; \
 AfterInstall: UnZip(ExpandConstant('{tmp}\archive.zip'), ExpandConstant('{app}'))

仅提取部分文件的示例,请参阅:
如何让 Inno Setup 解压单个文件?


8
投票

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

我想问为什么你需要内容的 ZIP 文件?我个人会将未压缩的文件放入安装程序中。然后,我将有两个

[category]
条目,一个用于应用程序,一个用于数据。默认两者都被选中。

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

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

更新:

默认情况下,放置在 setup.exe 中的文件是 压缩的

您还可以将文件提取到临时位置,以便您可以运行您的 安装应用程序,然后将其删除。

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

1
投票

您可以创建静默自解压存档 (SFX) 存档,此处描述的示例如何为您需要的内容创建 SFX 存档,然后编写 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;

它对我来说非常有效。


-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
© www.soinside.com 2019 - 2024. All rights reserved.