web-dev-qa-db-ja.com

Inno Setupにインストールしたファイルを解凍する方法(すべて1つのインストールプロセスの一部として)

帯域幅/スペースを節約し、偶発的な干渉を防ぐために、データベース製品(Ajaxと呼びます)のインストールファイルが圧縮されています(そのファイルを「AJAX_Install_Files.Zip」と呼びます)。Inno-Setupを「インストール」したいと思います。 (つまり、コピーして)AJAX_Install_Files.Zipファイルを宛先に移動し、ファイルを.Zipファイルと同じフォルダーに解凍します。後続のプログラムがInno Setupによって起動され、製品「Ajax」のインストールが実際に実行されます。 "。

Inno Setup Webサイト のドキュメント、FAQ、およびKBを確認しましたが、Pascalスクリプト(コード)を作成する以外にこれは不可能と思われます-それは正しいでしょうか、それともありますか?代替ソリューションはありますか?

17
Dan Aquinas

外部コマンドラインツールを使用してアーカイブを解凍できます。たとえば、 ここ を参照してください。 [ファイル]セクションに入れてください:

[Files]
Source: "UNZIP.EXE"; DestDir: "{tmp}"; Flags: deleteafterinstall

次に、[実行]セクションで次のように呼び出します。

[Run]
Filename: "{tmp}\UNZIP.EXE"; Parameters: "{tmp}\ZipFile.Zip -d C:\TargetDir"

(おそらく、スクリプト変数からターゲットディレクトリを取得する必要があるため、実行する必要のある作業がさらにいくつかあります)

25
Treb

私は非常に 同様の質問 に答えました、そして詳細のいくつかが適用されます。

なぜコンテンツのZipファイルが必要なのか疑問に思います。私は個人的に非圧縮ファイルをセットアップに配置します。次に、2つの[category]エントリ1つはアプリケーション用、もう1つはデータ用です。デフォルトでは両方がチェックされます。

これにより、ユーザーは後日必要に応じて新しいデータセットをインストールできます。

本当にZipファイルが必要で、それを簡単にしたい場合は、Zipファイルと非圧縮ファイルの両方を同じセットアップで出荷してください。

更新:

デフォルトでは、setup.exeに配置されるファイルは 圧縮 です。

また、ファイルを一時的な場所に抽出して、インストールアプリケーションを実行し、それらを削除することもできます。

[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
9
Robert Love

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で単一のファイルを解凍する方法は?

9
Martin Prikryl

サイレント自己解凍アーカイブ(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;

それは私にとって完璧に機能しました。

1
random one