如何在安装后使用InnoTools解压缩多个文件?

时间:2019-06-08 05:55:23

标签: inno-setup unzip

我来自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作品。

1 个答案:

答案 0 :(得分:0)

您甚至无法提取一个.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;

enter image description here