如果尚未安装软件包,我需要安装MSI软件包.我还需要安静地安装它.该软件包提示用户:
我需要使用命令行参数或其他一些方法覆盖这两个参数.那么我该如何解决这两个问题呢.我将使用VBScript进行脚本编写.
msiexec
是安装MSI程序的命令提示符软件.但我发现只需在命令行输入MSI文件的名称,就可以从命令行安装MSI文件.
但是为了卸载MSI文件,你似乎必须调用该msiexec
程序并给它一个/x
或/uninstall
.
如何在不使用msiexec
例程的情况下从命令行卸载MSI ?
TL; DR:为什么我需要在这个条件组件中使用空 <CreateFolder/>
元素才能使其工作?
我正在为一个内部应用程序组装一个简单的基于WiX的安装程序.此安装程序需要部署标准配置文件(普通.NET .config
文件),然后使用msiexec
在命令行上传递的属性对其进行自定义.
其中一个自定义是仅在已定义RUNTIME属性时才创建特定的应用程序设置.这是WiX组件:
<Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime"
Guid="*">
<Condition>
<![CDATA[RUNTIME]]>
</Condition>
<CreateFolder/>
<util:XmlFile Id="X.Runtime.1"
Action="createElement"
ElementPath="/configuration/appSettings"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
Name="add"
Sequence="2"/>
<util:XmlFile Id="X.Runtime.2"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
ElementPath="/configuration/appSettings/add[\[]not(@key)[\]]"
Action="setValue"
Name="key"
Value="RunTime"
Sequence="3"/>
<util:XmlFile Id="X.Runtime.3"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
ElementPath="/configuration/appSettings/add[\[]@key='RunTime'[\]]"
Action="setValue"
Name="value"
Value="[RUNTIME]"
Sequence="4"/>
</Component>
Run Code Online (Sandbox Code Playgroud)
这正如我想要的那样 - 如果在命令行上指定了RUNTIME,则会msiexec
创建新元素; 如果没有,没有任何反应.
为什么我必须<CreateFolder/>
在此组件中使用空?
当我试图让这个工作时,我找到了" Wix条件声明 ",它显示了一个工作组件,但没有解释为什么<CreateFolder/>
是必要的.
删除<CreateFolder/>
给我这个错误:
ICE18:组件的KeyPath:'C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime'是目录:'INSTALLDIR'.目录/组件对必须在CreateFolders表中列出.
一旦你知道这意味着什么,我相信,这是非常有用的.
我一直在尝试使用以下命令为安装程序创建问题的日志文件:
msiexec /i "installer.msi" /l*v "log.log"
msiexec /i "installer.msi" /l*v
msiexec /l*v /i "installer.msi"
msiexec /l*v "log.log" /i "installer.msi"
Run Code Online (Sandbox Code Playgroud)
和命令的其他几个变体,但它总是弹出窗口,说明哪些命令行参数对msiexec有效.使msi文件创建日志的正确方法是什么?我有Windows安装程序4.5.
我想在特定目录中安装带有msiexec的msi.我正在使用:
msiexec /i "msi path" INSTALLDIR="C:\myfolder" /qb
Run Code Online (Sandbox Code Playgroud)
它不能与"INSTALLDIR"一起使用,因为msi是在默认路径中安装而不是在我的特定路径中.
我的机器上安装了一个应用程序.我也有它的源代码,但不知何故,此应用程序的ProductCode和UpgradeCode已更改.
现在我想获得这个已安装应用程序的UpgradeCode和ProductCode.我觉得必须有一些工具.
谁能告诉我如何获得已安装应用程序的UpgradeCode和ProductCode?
经过太多的实验,我得出结论,Windows Installer简直就是糟糕的技术.但客户需要MSI文件.
那么,我如何创建一个MSI文件,将EXE文件提取到临时目录并使用与传递给EXE文件相同或相似的选项运行它?
Msiexec(命令行选项)中解释了MSI的选项(MSI的低级"运行"是msiexec选项package.msi).
编辑:mjmarsh的WiX解决方案看起来很有效.我还没有机会尝试它(关键时刻).如果它有效,我会接受它.
编辑:它不起作用.遗失的部分:有人/无人看管似乎没有.
无论如何,唯一能完成这项工作的是自定义动作来杀死它的父进程!
编辑:所以有人发布了一个进一步的答案包装整个事情作为安装后的自定义操作.理论上可行,但由于可能需要重新启动(感谢MS for .NET 4有时需要重新启动),我们必须做进一步的hackery.所以从优势矩阵:
Transparency: No. One big custom action.
Customizability: No.
Standardization: No.
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work …
Run Code Online (Sandbox Code Playgroud) 使用BAT/CMD
脚本我可以简单地使用"msiexec /i <whatever.msi> /quiet /norestart"
然后检查%errorlevel%
结果.
与VBScript
使用Wscript.Shell
对象Run()
的方法,我能得到这样的结果:
"result = oShell.Run("msiexec /i ...", 1, True)"
Run Code Online (Sandbox Code Playgroud)
如何使用PowerShell执行此操作?
我正在尝试自动卸载使用WiX创建的软件包,以便更改已安装的软件堆栈和配置,而无需重新配置整个操作系统.最终我将使用powershell脚本来执行此操作,但目前我似乎无法使用cmd以交互方式卸载我的测试包.
如果我跑:
msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'
msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8
我明白了:
"无法打开安装包.验证包是否存在以及您是否可以访问它,或联系应用程序供应商以验证这是否是有效的Windows Installer程序包."
如果我跑:
msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
我明白了:
"此操作仅对当前安装的产品有效"
我查看了Windows安装程序指南,WiX文档,msiexec文档,并使用orca自己查看.msi,但我还没有找到任何可以清楚地了解卸载处理方式的内容.是否需要.msi文件,如果没有,那么为什么Windows安装程序在给出GUID时似乎认为它是?
.msi安装程序的WiX代码是:
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.microsoft.com/wix/2006/wi' >
<!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->
<Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057'
Manufacturer='COMPANYNAME IT-Operations'
Name='COMPANYNAMEServerListener' Version='1.0.0'
UpgradeCode='PUT-GUID-HERE'>
<Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
<Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='COMPANYNAME' Name='COMPANYNAME'>
<Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
<Component Id='MainExecutable' Guid='*' > …
Run Code Online (Sandbox Code Playgroud) Windows Installer技术支持管理安装.启动管理安装的命令行是:' msiexec/a setup.msi '.我想了解这种安装的目的以及它们在哪些情况下有用?
msiexec ×10
wix ×4
installer ×3
.net ×1
automation ×1
command-line ×1
exit-code ×1
install ×1
installation ×1
logging ×1
path ×1
powershell ×1
return-value ×1
uninstall ×1