9

MySQLをサイレントインストールするために、cmdで次のコマンドを試してみましたが、正常に動作します。

msiexec /i "mysql-essential-6.0.11-alpha-winx64.msi" /qn

しかし、 Inno Setupにインストールする前にそのコマンドを実行するにはどうすればよいですか?

4

1 に答える 1

11

ステップがになるときに、イベントメソッドExecから関数を呼び出すことで実行できます。次のスクリプトは、そのMySQLインストーラーをセットアップに含める方法と、インストールが開始される直前にそれを抽出して実行する方法を示しています。CurStepChangedssInstall

#define MySQLInstaller "mysql-essential-6.0.11-alpha-winx64.msi"

[Files]
Source: "{#MySQLInstaller}"; Flags: dontcopy
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  Params: string;
  ResultCode: Integer;
begin
  if (CurStep = ssInstall) then
  begin
    ExtractTemporaryFile('{#MySQLInstaller}');
    Params := '/i ' + AddQuotes(ExpandConstant('{tmp}\{#MySQLInstaller}')) + ' /qn';
    if not Exec('msiexec', Params, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
      MsgBox('Installation of MySQL failed. Exit code: ' + IntToStr(ResultCode),
             mbInformation, MB_OK);
  end;
end;

未使用のプログレスバーを利用します。

MySQLのインストールが完了するまでに時間がかかり、インストーラーのユーザーインターフェイスを非表示にすることにしたため(とにかく安全ではない可能性があります)、スクリプトを拡張して、に表示される進行状況バーを使用できます。インストール中の開始位置で、その時点では使用されていません。次のコードは、(少なくともWindows XPシステムでは)Inno Setupのインストールプログレスバーをに切り替えmarquee style、ステータスラベルに説明を表示します。MySQLのインストールが完了すると、プログレスバーが通常モードに戻り、実際のInnoSetupのインストールが開始されます。

#define MySQLInstaller "mysql-essential-6.0.11-alpha-winx64.msi"

[Files]
Source: "{#MySQLInstaller}"; Flags: dontcopy
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  Params: string;
  ResultCode: Integer;
begin
  if (CurStep = ssInstall) then
  begin
    WizardForm.ProgressGauge.Style := npbstMarquee;
    WizardForm.StatusLabel.Caption := 'Installing MySQL. This may take a few minutes...';

    ExtractTemporaryFile('{#MySQLInstaller}');
    Params := '/i ' + AddQuotes(ExpandConstant('{tmp}\{#MySQLInstaller}')) + ' /qn';
    if not Exec('msiexec', Params, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
      MsgBox('Installation of MySQL failed. Exit code: ' + IntToStr(ResultCode),
             mbInformation, MB_OK);

    WizardForm.ProgressGauge.Style := npbstNormal;
    WizardForm.StatusLabel.Caption := '';
  end;
end;
于 2013-02-20T16:07:22.157 に答える