为了节省带宽/空间以及防止意外干扰,数据库产品的安装文件(称之为Ajax)已被压缩(调用该文件“AJAX_Install_Files.ZIP”。我想要Inno-Setup将AJAX_Install_Files.ZIP文件“安装”(即复制)到目标,然后将文件解压缩到.ZIP文件所在的同一文件夹中。后续程序将由Inno Setup启动以实际运行安装产品“Ajax”。
我在Inno Setup website查看了文档,常见问题解答和知识库,除了编写Pascal脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代方案溶液
答案 0 :(得分:22)
您可以使用外部命令行工具解压缩档案,例如,请参阅here。把它放在你的[文件]部分:
[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall
然后在[Run]部分中调用它,如下所示:
[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"
(您可能希望从脚本变量中获取目标目录,因此还需要完成一些工作)
答案 1 :(得分:8)
您可以使用shell Folder.CopyHere
method来提取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及更高版本。
有关仅提取某些文件的示例,请参阅:
How to get Inno Setup to unzip a single file?
答案 2 :(得分:7)
我回答了非常similar question,其中一些细节也适用。
我会问你为什么需要内容的ZIP文件?我个人会将未压缩的文件放入设置中。然后,我将有两个[category]
条目用于应用程序,一个用于数据。默认情况下都要检查。
这将允许用户在以后需要时安装一组新数据。
如果您真的想要一个ZIP文件,并希望保持简单,可以在同一设置中同时发送zip文件和未压缩文件。
更新
默认情况下,放置在setup.exe中的文件为compressed。
您还可以将文件解压缩到临时位置,以便运行 安装应用程序,然后删除它们。
[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
答案 3 :(得分:0)
您可以只创建静默的自解压存档(SFX)存档,在此处how to create SFX archive中描述所需示例,并编写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;
对我来说效果很好。
答案 4 :(得分:-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