Как заставить Inno Setup распаковать установленный файл (все как часть одного процесса установки) - PullRequest
16 голосов
/ 20 мая 2011

Чтобы сохранить пропускную способность / пространство, а также предотвратить случайное вмешательство, установочные файлы для продукта базы данных (назовите его Ajax) были заархивированы (назовите этот файл "AJAX_Install_Files.ZIP). Я хотел бы иметь Inno-Setup«установить» (т. е. скопировать) файл AJAX_Install_Files.ZIP в место назначения, а затем разархивировать файлы в ту же папку, где находится файл .ZIP. Программа Inno Setup запустит последующую программу, чтобы фактически запустить установкупродукт "Ajax".

Я просмотрел документацию, часто задаваемые вопросы и КБ на веб-сайте Inno Setup , и это кажется невозможным, кроме написания сценария на языке Паскаль (код)- это будет правильно, или есть альтернативные решения?

Ответы [ 4 ]

23 голосов
/ 03 июня 2011

Вы можете использовать внешний инструмент командной строки для распаковки архива, см., Например, здесь .Поместите его в свой раздел [Files]:

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

Затем назовите его в свой раздел [Run], например:

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

(Вы, вероятно, захотите взять свою цельдиректории из переменной скрипта, так что нужно еще немного поработать)

8 голосов
/ 20 ноября 2016

Вы можете использовать оболочку 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 и новее.


Пример извлечения только некоторых файлов см .:
Как заставить Inno Setup распаковать один файл?

8 голосов
/ 20 мая 2011

Я ответил на очень похожий вопрос , и некоторые детали применимы.

Я бы спросил, зачем вам ZIP-файл с содержимым?Я лично поместил бы несжатые файлы в установку.Тогда у меня будет две [category] записи, одна для приложения и одна для данных.По умолчанию оба будут проверены.

Это позволит пользователям установить новый набор данных при необходимости позднее.

Если вы действительно хотите ZIP-файл и хотите, чтобы вам было легко, вы можете отправить обаzip-файлы и несжатые файлы в одной и той же настройке.

Обновление:

По умолчанию файлы, помещаемые в файл setup.exe, сжаты .

Вы также можете извлечь файлы во временную папку, чтобы запустить приложение установки, а затем удалить их.

[Files]
Source: "Install1.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
Source: "Install2.SQL"; DestDir: "{tmp}"; Flags:deleteafterinstall;
0 голосов
/ 07 июня 2019

Вы можете просто создать тихий самораспаковывающийся архив (SFX), пример описан здесь , как создать SFX-архив для нужных вам вещей, и написать код на Pascal, чтобы просто запустить его вот так (скрипт для InnoНастройка 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;

У меня сработало отлично.

...