安装其他安装程序?

时间:2015-11-12 16:16:24

标签: powershell wix installer inno-setup nsis

我的任务是将50页的安装手册减少到更少的&#34 ;;需要以特定顺序安装一堆应用程序,具有特定选项,等等。我可以使用任何流行的安装程序(WiX,NSIS,Inno Setup)自动执行此过程,还是需要使用Powershell?

我已经了解了这些安装程序可以执行的操作,并且据我所知,它们的设计目的是将一个应用程序安装到一台计算机上 - 我没有'看到 甚至如果它们可以用来以非常详细的方式控制其他安装程序 - "使用这个,这个,以及此向导页面上的此选项,但不是下一个向导页面上的那个选项,并安装到此路径,然后输入这些详细信息(用户,无论如何)"。

我是否过分理解这些工具可以做什么?鉴于我需要这样做,最好的方法是什么?

更新2:我了解安装程序通过配置文件提供静默安装。整齐!我目前正在关注NSIS(产生Powershell脚本和其他安装程序)作为最容易启动的选项&跟着去吧。我喜欢我不需要自定义IDE。但我也想知道,在Windows 7& 10世界中,NSIS(很快)已经过时了吗?

4 个答案:

答案 0 :(得分:2)

您应该使用自定义引导程序UI查看WiX。这可用于以您想要的任何顺序安装任意数量的设置。棘手的问题是所有这些设置是否需要一个接一个地显示自己的UI。如果它们都可以通过命令行参数静默安装,那么您的WiX引导程序可以显示您的UI以收集所有选项,然后在显示整个操作的进度时静默安装每个设置。您还可以在“程序和功能”中获取整个包的单个条目。所以像WiX这样的东西可以做到,但UI要求可能会让它变得尴尬。

答案 1 :(得分:1)

PowerShell可以做到这一点,但它是通过调用COM对象并将密钥发送到窗口,所以这不是最好的方法。我将重新发布一些我昨天发布的关于使用PowerShell卸载一些不需要的软件的类似问题。

QFT:

PowerShell不会与提示交互...你不能告诉它在可执行文件中单击“下一步”,因为它无法看到它。

你可以发送密钥给它。你真的只是使用COM对象。

因此,首先,通过设置包含数组的变量来获取进程ID,该数据的数据由进程名称定义。假设您的流程被称为“卸载”,并且流程正在运行:

$a = Get-Process | ?{$_.Name -eq "Uninstall"}

启动COM:

$wshell = New-Object -ComObject wscript.shell;

将带有此进程ID的卸载程序带到前面,以便我们可以发送键击:

$wshell.AppActivate($a.id)

给它几秒钟的时间来推进那个窗口。我选择了5,但是如果你的机器没有压力,2可能就足够了:

Start-Sleep 5

现在开始告诉它你要发送什么密钥。这里的语法是这样的:()中的任何内容都将被发送。单引号中的位置是要发送的击键,逗号之后是您希望它在继续之前等待多长时间。假设第一个屏幕是“Next”,您可以通过告诉PowerShell发送ENTER键并等待5秒来发送第一个命令:

$wshell.SendKeys('~',5)

等待功能是可选的,但出于您的目的,您肯定会想要它。 (如果您不希望它$wshell.SendKeys('~')将发送ENTER键并立即转到下一个命令。)

使用所有击键手动完成卸载操作,对于您发送的任何击键,请注意卸载卸载的下一部分所需的时间,并等待比脚本更长的时间(例如,如果它处理你的ENTER键瞬间完成,我会在发送下一个命令之前等待3或5秒。如果加载需要5秒钟,我会告诉它等待10秒再发送下一个命令。)

字母是字母,数字是数字。大多数非命令只是分配给它们的键(这意味着如果你想输入“K”,你的命令就是$wshell.SendKeys('K'))你可以在这里得到特定键的纲要:https://msdn.microsoft.com/en-us/library/office/aa202943(v=office.10).aspx

/ QFT

您可能想要查看Auto-It,但这是基于像素的,最后我检查过,因此如果您在具有不同屏幕分辨率的计算机上运行它,则可能会导致问题。

答案 2 :(得分:1)

如何处理此问题实际上取决于这些其他安装程序是否支持静默模式和/或应答文件。 This page列出了一些流行安装程序的选项。

如果他们这样做并且您决定使用NSIS,那么您只需执行以下操作:

Name "BundleInstaller"
OutFile "bundlesetup.exe"
RequestExecutionLevel Admin

Page Components # Comment out this if you don't want the user to have a choice
Page InstFiles

Section -Init
InitPluginsDir # $PluginsDir directory is deleted when the installer quits
SetOutPath "$PluginsDir"
SectionEnd

Section "Foo v1.2.3"
DetailPrint "Installing Foo"
File "FooSetup.exe"
ExecWait '"$PluginsDir\FooSetup.exe" /S /D=$ProgramFiles\Foo' # This is the syntax for NSIS installers
SectionEnd

Section "Bar 2015"
DetailPrint "Installing Bar 2015"
File "BarSetup.msi"
ExecWait '"MSIEXEC" /qb /i "$PluginsDir\BarSetup.msi" REBOOT=ReallySuppress' 
SectionEnd

Section -Cleanup
SetOutPath "$Temp" # Release current directory lock on $PluginsDir
SectionEnd

如果无法使用此解决方案,那么您正在考虑某种形式的自动化,如其他答案所示。

我说有两种形式的自动化;一个你自动化的应用程序必须是活动窗口,另一个是你发送消息而不是按键的。

只需将 Enter 发送到活动窗口并进行一些睡眠,这当然是一个简单的解决方案,但如果有人开始与机器进行交互,它可能会中断。

NSIS支持FindWindowSendMessage等命令,我认为AutoHotkey也可以。使用FindWindow查找特定HWND然后直接向其发送消息的好处当然是应用程序不必具有键盘焦点。这种方法需要更多工作,但最终结果更好,因为您在找到正确的窗口后只使用SendMessage(并且您可以确保窗口/控件可见并启用等),因此您知道应用程序处于已知状态而没有不得不希望睡眠足够长......

答案 3 :(得分:1)

安装其他安装程序对于任何体面的安装程序构建器都没有问题。

这些其他安装程序可以是msiexezip个文件。

  

我不认为安装程序(对于SQL数据库服务器等)提供静默安装(通过一百万个命令行参数或配置文件)。

     

我非常怀疑我可以在静默模式下启动这些安装程序(有一百万个命令行参数)...... :-(

获取SQL数据库服务器的安装程序并进行检查。 大多数安装程序都提供静默安装。

  • msi或其他安装程序构建器创建的exe文件接受CLI参数以选择组件并设置目标路径
  • 即使是作为SFX存档创建的exe文件也接受解包的目标路径
  • 某些安装程序不提供其GUI配置对话框的所有表单字段作为CLI参数。对于那些安装程序,您需要一个配置后步骤,其中可能只包括将默认配置文件复制到应用程序文件夹中
  • 是的,也可以使用AutoIt,AutoHotkeys或主安装程序内部的任何其他自动化工具,使安装程序围绕“gui自动化”或“插入击键”的想法。
    • 您需要为每个安装程序构建自动化脚本,并从主安装程序执行它。它可能非常适合测试和重放单个组件安装。
    • YAGNI
  

鉴于我需要这样做,最好的方法是什么?

完整运行并记下所有安装步骤。

  • 列出您需要的安装程序
  • 找到下载网址
  • 下载安装程序
  • 下载您需要的其他工具(解压缩?)
  • 为每个安装程序检查它接受的CLI参数
    • 检查你是否得到了一个合适的默认配置,当离开一些CLI args时
  • 将每个安装程序从CLI安装到目标位置

然后将您拥有的步骤转换为您选择的安装程序构建器。它主要是将CLI命令复制粘贴到Exec()或ShellExec()调用中,然后复制配置文件并摆弄跨组件配置。

  

我还没有看到,或者甚至可以用它们以非常详细的方式控制其他安装程序

想想所有发布DirectX的游戏安装程序或预先打包的Web开发堆栈(如XAMPP或WPN-XM)(谈到最后一个:您可以查看此InnoSetup script文件)。

多个软件组件的包装安装非常常见。