帯域幅/スペースを節約し、偶発的な干渉を防ぐために、データベース製品(Ajaxと呼びます)のインストールファイルが圧縮されています(そのファイルを「AJAX_Install_Files.Zip」と呼びます)。Inno-Setupを「インストール」したいと思います。 (つまり、コピーして)AJAX_Install_Files.Zipファイルを宛先に移動し、ファイルを.Zipファイルと同じフォルダーに解凍します。後続のプログラムがInno Setupによって起動され、製品「Ajax」のインストールが実際に実行されます。 "。
Inno Setup Webサイト のドキュメント、FAQ、およびKBを確認しましたが、Pascalスクリプト(コード)を作成する以外にこれは不可能と思われます-それは正しいでしょうか、それともありますか?代替ソリューションはありますか?
外部コマンドラインツールを使用してアーカイブを解凍できます。たとえば、 ここ を参照してください。 [ファイル]セクションに入れてください:
[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall
次に、[実行]セクションで次のように呼び出します。
[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.Zip -d C:\TargetDir"
(おそらく、スクリプト変数からターゲットディレクトリを取得する必要があるため、実行する必要のある作業がさらにいくつかあります)
私は非常に 同様の質問 に答えました、そして詳細のいくつかが適用されます。
なぜコンテンツのZipファイルが必要なのか疑問に思います。私は個人的に非圧縮ファイルをセットアップに配置します。次に、2つの[category]
エントリ1つはアプリケーション用、もう1つはデータ用です。デフォルトでは両方がチェックされます。
これにより、ユーザーは後日必要に応じて新しいデータセットをインストールできます。
本当にZipファイルが必要で、それを簡単にしたい場合は、Zipファイルと非圧縮ファイルの両方を同じセットアップで出荷してください。
更新:
デフォルトでは、setup.exeに配置されるファイルは 圧縮 です。
また、ファイルを一時的な場所に抽出して、インストールアプリケーションを実行し、それらを削除することもできます。
[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
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
はWindowsVista以降で機能することに注意してください。
一部のファイルのみを抽出する例については、以下を参照してください。
Inno Setupで単一のファイルを解凍する方法は?
サイレント自己解凍アーカイブ(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;
それは私にとって完璧に機能しました。