在一个安装程序中执行多个installers / exe?

时间:2013-01-09 10:04:53

标签: inno-setup nsis

我希望软件安装程序在一个安装程序完成安装后执行另一个exe / installer。无论使用哪个安装程序(NSIS,Inno Setup等),我都想这样做。

甚至可能吗?

3 个答案:

答案 0 :(得分:5)

您只能使用[RUN]部分和parameters以及标准或自定义Checks。 请记住设置priopriate Flags - waituntilterminated使安装程序脚本等到一个启动完成它的操作然后启动下一个操作。

示例:

[Files]
Source: "C:\MyInstallers\*"; DestDir: "{tmp}"; 
Flags: createallsubdirs recursesubdirs deleteafterinstall ignoreversion uninsremovereadonly 

[Run]
Filename: "{tmp}\dotnetfx35.exe"; Parameters: "/q"; 
Flags: waituntilterminated skipifdoesntexist; 
StatusMsg: "Instalacja bibliotek Microsoft .NET Framework 3.5 SP1..."; 
OnlyBelowVersion: 0,6.2.8400; Check: NET35

Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/Q"; 
Flags: waituntilterminated skipifdoesntexist; 
StatusMsg: "Instalacja bibliotek Microsoft Visual C++ 2008 (x86)..."; 
Check: not Is64BitInstallMode

Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/Q"; 
Flags: waituntilterminated skipifdoesntexist; 
StatusMsg: "Instalacja bibliotek Microsoft Visual C++ 2008 (x64)..."; 
Check: Is64BitInstallMode

Filename: "{tmp}\directx\DXSETUP.exe"; Parameters: "/silent"; 
Flags: waituntilterminated skipifdoesntexist; 
StatusMsg: "Instalacja bibliotek Microsoft DirectX..."

Filename: "{app}\{#MyAppExeName}"; WorkingDir: "{app}\"; 
Flags: nowait postinstall runascurrentuser skipifsilent; 
Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"

答案 1 :(得分:2)

NSIS:

Section
InitPluginsDir ; $pluginsdir is a folder in %temp%, it is deleted for you when the installer ends
SetOutPath $PluginsDir

File "child1.exe"
ExecWait '"$PluginsDir\child1.exe" /foo "/bar" /baz'
Delete "$PluginsDir\child1.exe" ; Optional, might be a good idea if the file is large...

File "child2.exe"
ExecWait '"$PluginsDir\child2.exe"'

SetOutPath $Temp ; Don't lock $PluginsDir
SectionEnd

答案 2 :(得分:0)

在innosetup中,您还可以使用ShellExec-Function进行另一次安装。有了它,您可以定义它是否应该在前面,以及主安装是否应该等到这个子安装完成。

这是一个简短的例子,我在Code-Section

中开始安装sqltools
  if ShellExec('',INSTALL_FOLDER + '\FPS\contributed\sqlncli_x64.msi', '' ,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) then
    begin
      Log('executed sql native client with result code ' + IntToStr(ResultCode) + ' this means ' + SysErrorMessage(ResultCode));
    end
  else
    begin
      showError(CustomMessage('SQLNATIVE_CLIENT_ABORTED') + SysErrorMessage(ResultCode));
    end;