Dan*_*nas 17 zip inno-setup unzip
为了节省带宽/空间以及防止意外干扰,数据库产品的安装文件(称之为Ajax)已被压缩(调用该文件"AJAX_Install_Files.ZIP).我想让Inno-Setup"安装" (即,复制)AJAX_Install_Files.ZIP文件到目标,然后将文件解压缩到.ZIP文件所在的同一文件夹中.后续程序将由Inno安装程序启动以实际运行产品安装"Ajax ".
我查看了Inno Setup网站上的文档,FAQ和KB,除了编写Pascal脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代解决方案?
Tre*_*reb 25
您可以使用外部命令行工具来解压缩存档,例如,请参阅此处.把它放在你的[Files]部分:
[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall
Run Code Online (Sandbox Code Playgroud)
然后在[Run]部分中调用它,如下所示:
[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"
Run Code Online (Sandbox Code Playgroud)
(您可能希望从脚本变量中获取目标目录,因此还需要完成一些工作)
我回答了一个非常相似的问题,其中一些细节也适用.
我会问为什么你需要一个内容的ZIP文件?我个人会将未压缩的文件放入设置中.然后,我将有两个[category]用于应用程序的条目和一个用于数据的条目.默认情况下都要检查.
这将允许用户在以后需要时安装一组新数据.
如果你真的想要一个ZIP文件,并希望保持简单,你可以在同一设置中发送zip文件和未压缩文件.
更新:
默认情况下,压缩安装在setup.exe中的文件.
您还可以将文件解压缩到临时位置,以便运行安装应用程序,然后删除它们.
[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Run Code Online (Sandbox Code Playgroud)
您可以使用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;
Run Code Online (Sandbox Code Playgroud)
请注意,标志SHCONTCH_NOPROGRESSBOX和SHCONTCH_RESPONDYESTOALLWindows Vista和更新版本的工作.
有关仅提取某些文件的示例,请参阅:
如何让Inno Setup解压缩单个文件?