微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取Inno Setup来解压缩已安装的文件全部作为一个安装过程的一部分

如何解决如何获取Inno Setup来解压缩已安装的文件全部作为一个安装过程的一部分

| 为了节省带宽/空间并防止意外干预,已压缩了数据库产品的安装文件(称为Ajax)(称为该文件“ AJAX_Install_Files.ZIP”。我想使用Inno-Setup”)安装\”(即,将AJAX_Install_Files.ZIP文件复制到目标位置,然后将文件解压缩到.ZIP文件所在的文件夹中。InnoSetup将触发后续程序以实际运行安装产品“ Ajax”。 我在Inno Setup网站上浏览了文档,常见问题解答和知识库,除了编写Pascal脚本(代码)外,这似乎不可能-正确吗,或者有其他替代解决方案吗?     

解决方法

您可以使用外部命令行工具来解压缩存档,例如,请参见此处。将其放在您的[文件]部分中:
[Files]
Source: \"UNZIP.EXE\"; DestDir: \"{tmp}\"; Flags: deleteafterinstall
然后在[运行]部分中调用它,如下所示:
[Run]
Filename: \"{tmp}\\UNZIP.EXE\"; Parameters: \"{tmp}\\ZipFile.ZIP -d C:\\TargetDir\"
(您可能希望从脚本变量获取目标目录,因此还需要完成一些工作)     ,我回答了一个非常类似的问题,其中一些细节适用。 我会问为什么您需要内容的ZIP文件?我个人将未压缩的文件放入安装程序。然后,我将有两个
[category]
条目,一个用于应用程序,一个用于数据。默认都被选中。 这将允许用户在以后需要时安装一组新的数据。 如果您确实想要一个ZIP文件并希望保持简单性,则可以在同一设置中同时发送zip文件和未压缩的文件。 更新: 默认情况下,将压缩放置在setup.exe中的文件。 您也可以将文件提取到一个临时位置,以便运行 安装应用程序,然后将其删除。
[Files]
Source: \"Install1.SQL\"; DestDir: \"{tmp}\"; Flags:deleteafterinstall;
Source: \"Install2.SQL\"; DestDir: \"{tmp}\"; Flags:deleteafterinstall;
    ,您可以使用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及更高版本上可以使用。 有关仅提取某些文件的示例,请参见: 如何使Inno Setup解压缩单个文件?     ,您可以仅创建静默自解压存档(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;
它对我来说非常有效。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。