Powershell 安装其他安装程序?

Powershell 安装其他安装程序?,powershell,wix,installation,inno-setup,nsis,Powershell,Wix,Installation,Inno Setup,Nsis,我的任务是将一本50页的安装手册缩减到“更少”;许多应用程序需要按照特定的顺序安装,并带有特定的选项,等等。我可以使用任何流行的安装程序(WiX、NSIS、Inno安装程序)来自动化此过程,还是需要使用Powershell 我读过关于这些安装程序可以做什么的文章,据我所知,它们被设计为将一个应用程序安装到一台计算机上——我还没有看到,或者即使它们可以用来以非常详细的方式控制其他安装程序--“在此向导页上使用此、此和此选项,但在下一向导页上不要使用此选项,然后安装到此路径,然后输入这些详细信息(用

我的任务是将一本50页的安装手册缩减到“更少”;许多应用程序需要按照特定的顺序安装,并带有特定的选项,等等。我可以使用任何流行的安装程序(WiX、NSIS、Inno安装程序)来自动化此过程,还是需要使用Powershell

我读过关于这些安装程序可以做什么的文章,据我所知,它们被设计为将一个应用程序安装到一台计算机上——我还没有看到,或者即使它们可以用来以非常详细的方式控制其他安装程序--“在此向导页上使用此、此和此选项,但在下一向导页上不要使用此选项,然后安装到此路径,然后输入这些详细信息(用户,无论什么)”

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


更新2:我了解到安装程序确实通过配置文件提供静默安装。整洁!我目前正在考虑NSIS(生成Powershell脚本和其他安装程序)作为最容易启动和使用的选项。我喜欢它,我不需要自定义IDE。但我也想知道NSIS是否(很快)在Windows 7和10的世界里,它已经过时了?

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
现在开始告诉它你想发送什么键。这里的语法是:()中的内容就是要发送的内容。单引号中的位置是要发送的击键,逗号后是你希望它等待多长时间才能继续。假设第一个屏幕是“下一步”“您可以通过告诉PowerShell发送ENTER键并等待5秒来发送第一个命令:

$wshell.SendKeys('~',5)
wait函数是可选的,但是出于您的目的,您肯定会想要它。(如果不需要,
$wshell.SendKeys(“~”)
将发送ENTER键并立即移动到下一个命令。)

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

字母是字母,数字是数字。大多数非命令只是分配给它们的键(这意味着,如果您想键入“K”,您的命令将是
$wshell.SendKeys('K')
),您可以在此处获取特定键的详细信息:

/QFT
您可能想查看Auto-It,但这是基于像素的,上次我检查过,所以如果您在不同屏幕分辨率的机器上运行它,它可能会导致问题。

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

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

如果他们这样做了,而您决定使用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支持像
FindWindow
SendMessage
这样的命令,我认为AutoHotkey也支持。使用FindWindow查找特定的,然后直接发送消息的优势当然是应用程序不必有键盘焦点。这种方法需要更多的工作,但最终结果是b更重要的是,因为只有在找到正确的窗口后才使用SendMessage(并且您可以确保窗口/控件可见并已启用等),所以您知道应用程序处于已知状态,而不必希望睡眠时间足够长…

安装其他安装程序对于任何一个像样的安装生成器来说都没有问题

这些其他安装程序是
msi
exe
zip
文件

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