如何使用 InnoTools post 安装解压多个文件?

How to unzip multiple files with InnoTools post install?

脚本示例来自http://www.saidsimple.com/daniel/blog/117966/,它只设置了一个 zip。我希望能够在特定位置解压缩任何拉链。我想一种方法可能是通配符 *.zip,因为 zip 名称可能会因之前的安装程序选择而异。

没有发生解压缩。我错过了定义某些东西或程序设置不正确。在我的使用中,zip 是预期程序读取功能的文本文件。

[Setup] …
SolidCompression=true
Compression=lzma
CreateAppDir=false
DirExistsWarning=false
ShowLanguageDialog=false
CreateUninstallRegKey=no
#include <idp.iss>

[Files]
Source: "{tmp}\text.net";  DestDir: "{userappdata}\ccc"; Flags: external; Components: abc
Source: "{tmp}\HLNJ.zip";  DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall; Components: hlnj
Source: "{tmp}\HNJ.zip"; DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall; Components: hnj

[Code]
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;
procedure InitializeWizard; ...
begin ...
end;
procedure CurStepChanged(CurStep: TSetupStep); ...
begin
  if CurStep = ssPostInstall then 
  begin ...
end;
end;

procedure unzip(ZipFile, TargetFldr: PAnsiChar);
var
 shellobj: variant;
 ZipFileV, TargetFldrV: variant;
 SrcFldr, DestFldr: variant;
 shellfldritems: variant;
begin
 if FileExists('{userappdata}\ccc\HLNJ.zip') then begin
 ForceDirectories('{userappdata}\ccc’);
 shellobj := CreateOleObject('Shell.Application');
 ZipFileV := string(ZipFile);
 TargetFldrV := string(TargetFldr);
 SrcFldr := shellobj.NameSpace(ZipFileV);
 DestFldr := shellobj.NameSpace(TargetFldrV);
 shellfldritems := SrcFldr.Items;
 DestFldr.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); 
 end;
end;

procedure ExtractSomething(src, target : AnsiString);
begin
 unzip(ExpandConstant(src), ExpandConstant(target));

end;

我希望其中一个拉链被解压。但是什么也没有,即使在创新日志中也是如此;这部分代码没有任何反应。至少删除 zip 是有效的。

编辑:我正在重新审视我去年没有解决的问题。问题是让 Unzip 工作。 Zip 下载到位置但未先解压缩就被删除。 编辑 2:可能不是最好的,但似乎有效。我已将我最近的代码更改为适用于 Inno 5 的工作版本(编辑了文件名,删除了设置。)

; #pragma include __INCLUDE__ + ";" + ReadReg(HKLM, "Software\Mitrich Software\Inno Download Plugin", "InstallDir")
#pragma include __INCLUDE__ + ";" + "c:\lib\InnoDownloadPlugin"

[Setup]
#include <idp.iss>

[Types]
Name: custom;  Description: "Custom installation"; Flags: iscustom

[Components]
Name: conn;  Description: “CC File”;  Types: custom; Flags: exclusive
Name: hlnj;  Description: “H L (Recommended)”; Types: custom; Flags: exclusive

[Files]
Source: "{tmp}\text.net";  DestDir: "{userappdata}\ccc”; Flags: external; Components: conn
Source: "{tmp}\HLNJ.zip”;  DestDir: "{userappdata}\ccc”; Flags: external deleteafterinstall; Components: hlnj conn

[Code]
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;
procedure InitializeWizard;
begin
    idpAddFileComp('http://ccc.sourceforge.net/text.net',  ExpandConstant('{tmp}\text.net'),  'conn');
    idpAddFileComp('http://ccc.sourceforge.net/SecurityUpdates/HLNJ.zip',  ExpandConstant('{tmp}\HLNJ.zip'), 'hlnj');

    idpDownloadAfter(wpReady);
end;

procedure CurStepChanged1(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
    FileCopy(ExpandConstant('{tmp}\text.net'), ExpandConstant('{userappdata}\ccc\text.net'), false);
    FileCopy(ExpandConstant('{tmp}\HLNJ.zip'), ExpandConstant('{userappdata}\ccc\HLNJ.zip'), false);
end;
end;

procedure unzip(ZipFile, TargetFldr: variant);
var
 shellobj: variant;
 SrcFldr, DestFldr: variant;
 shellfldritems: variant;
begin
 if FileExists(ZipFile) then begin
   if not DirExists(TargetFldr) then 
      if not ForceDirectories(TargetFldr) then begin
        MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
        Exit;
      end;   

   shellobj := CreateOleObject('Shell.Application');
   SrcFldr := shellobj.NameSpace(ZipFile);
   DestFldr := shellobj.NameSpace(TargetFldr);
   shellfldritems := SrcFldr.Items;
   DestFldr.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);

if FileExists(TargetFldr+'\HLNJ.zip') then MsgBox('HLNJ.zip'+ZipFile+
 ' extracted to '+TargetFldr, mbInformation, MB_OK);
 end else MsgBox('HLNJ.zip  does not exist', mbError, MB_OK);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
     unzip(ExpandConstant('{userappdata}\ccc\HLNJ.zip'),ExpandConstant('{userappdata}\ccc'));
  end;
  end;

您甚至无法提取一个 .zip 文件。 所以一步一步来,然后......

代码不完整。 所以只能猜猜是漏了什么还是错了什么。

要测试 unzip 程序是否正常运行,您应该使用一个简单的标准 inno-setup 程序。

如果可行,您可以添加额外的功能,然后更容易找到错误。

此外,使用的常量 "src" 和 "target" 也不可见。 它们是如何构建的?

unzip(ExpandConstant(src), ExpandConstant(target));

应避免使用不同类型的数据。

AnsiString 与 PAnsiChar

procedure unzip(ZipFile, TargetFldr: PAnsiChar);
....
end;

procedure ExtractSomething(src, target : AnsiString);
begin
  unzip(ExpandConstant(src), ExpandConstant(target));
end;

我怀疑 {tmp} 的使用是由 #include idp.iss 下载产生的。 此代码也不存在。

我们将对此进行模拟并使用来自已知目录的已知 zip 文件。所以我们不需要下载文件。

信息也没有害处,反而更容易发现错误。
我为此使用了一些 MsgBox()。

下面是一个简单的程序。

  • 复制HLNJ.zip文件到C:\HLNJ.zip 并查找 HLNJ.zip 的文件或文件夹名称部分 所以我们可以测试提取。
  • 我在这里使用一个名为 atext.txt 的文件,它是我的 HLNJ.zip
  • 的一部分

CreateOleObject 需要变体,因此请改用它们。

 [Files]
 ; Simulate the download of HLNJ.zip is ok
 ; On the development PC .. on the client PC.
 Source: "C:\HLNJ.zip"; DestDir: "{tmp}";

 ; Now "HLNJ.zip" is in the {tmp} folder so we can use it.
 Source: "{tmp}\HLNJ.zip";  DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall

[Code]
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;

....

procedure unzip(ZipFile, TargetFldr: variant);// <--- variant instead of PAnsiChar 
var
 shellobj: variant;
 SrcFldr, DestFldr: variant;
 shellfldritems: variant;
begin
 if FileExists(ZipFile) then begin
   if not DirExists(TargetFldr) then 
      if not ForceDirectories(TargetFldr) then begin
        MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
        Exit;
      end;    

   shellobj := CreateOleObject('Shell.Application');
   SrcFldr := shellobj.NameSpace(ZipFile);
   DestFldr := shellobj.NameSpace(TargetFldr);
   shellfldritems := SrcFldr.Items;
   DestFldr.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);

   if FileExists(TargetFldr+'\atext.txt') then MsgBox('ZipFile '+ZipFile+
     ' extracted to '+TargetFldr, mbInformation, MB_OK);

 end else MsgBox('ZipFile '+ZipFile+' does not exist', mbError, MB_OK);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
     unzip(ExpandConstant('{userappdata}\ccc\HLNJ.zip'),ExpandConstant('{userappdata}\ccc\extracted'));
  end;
end;