为了节省带宽/空间并防止意外干扰,数据库产品(称为 Ajax)的安装文件已被压缩(称为该文件“AJAX_Install_Files.ZIP”)。我希望安装 Inno-Setup “ “(即复制)AJAX_Install_Files.ZIP 文件到目标位置,然后将文件解压到 .ZIP 文件所在的同一文件夹中。Inno Setup 将启动后续程序以实际运行产品的安装”阿贾克斯”。
我已经浏览了 Inno Setup 网站 上的文档、常见问题解答和知识库,除了编写 Pascal 脚本(代码)之外,这似乎不可能 - 这是正确的,还是有任何替代解决方案?
您可以使用外部命令行工具来解压缩存档,例如,请参阅here。将其放入您的[文件]部分:
[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall
然后在 [Run] 部分调用它,如下所示:
[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.ZIP -d C:\TargetDir"
(您可能希望从脚本变量中获取目标目录,因此还需要完成一些工作)
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 及更高版本。
您可以像这样使用该功能:
[Files]
Source: "archive.zip"; DestDir: "{tmp}"; AfterInstall: UnZipCurrentFileTo('{app}')
将此辅助功能放在下方
UnZip
:
procedure UnZipCurrentFileTo(TargetPath: string);
begin
UnZip(ExpandConstant(CurrentFileName), ExpandConstant(TargetPath));
end;
如果您只使用一次,您可以这样做:
[Files]
Source: "archive.zip"; DestDir: "{tmp}"; \
AfterInstall: UnZip(ExpandConstant('{tmp}\archive.zip'), ExpandConstant('{app}'))
仅提取部分文件的示例,请参阅:
如何让 Inno Setup 解压单个文件?
我回答了一个非常类似的问题,其中一些细节适用。
我想问为什么你需要内容的 ZIP 文件?我个人会将未压缩的文件放入安装程序中。然后,我将有两个
[category]
条目,一个用于应用程序,一个用于数据。默认两者都被选中。
这将允许用户在以后需要时安装一组新的数据。
如果您确实想要 ZIP 文件并且希望保持简单,您可以在同一设置中发送 zip 文件和未压缩文件。
更新:
默认情况下,放置在 setup.exe 中的文件是 压缩的。
您还可以将文件提取到临时位置,以便您可以运行您的 安装应用程序,然后将其删除。
[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
您可以创建静默自解压存档 (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;
它对我来说非常有效。
使用双引号对我有用。 单引号不起作用。
[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