Windows installer 替换MSI中的小文件的最简单解决方案?

Windows installer 替换MSI中的小文件的最简单解决方案?,windows-installer,installation,orca,msitransform,Windows Installer,Installation,Orca,Msitransform,我们的许多客户都可以访问InstallShield、WISE或AdminStudio。这些都不是问题。我希望有某种方法可以为我们的小客户提供无需使用商业重新打包工具的免费工具集和步骤,以自行进行文件替换 只需替换压缩MSI中的单个配置文件,就可以假定目标用户已经安装了Orca,知道如何使用它来自定义属性表(嵌入GPO部署的许可证详细信息)并生成MST文件 免责声明:这与非常相似,但该线程中的问题和答案都不清楚。您需要向表中添加一个条目,添加另一个没有CAB文件的介质,以及比CAB文件的上一个序

我们的许多客户都可以访问InstallShield、WISE或AdminStudio。这些都不是问题。我希望有某种方法可以为我们的小客户提供无需使用商业重新打包工具的免费工具集和步骤,以自行进行文件替换

只需替换压缩MSI中的单个配置文件,就可以假定目标用户已经安装了Orca,知道如何使用它来自定义属性表(嵌入GPO部署的许可证详细信息)并生成MST文件




免责声明:这与非常相似,但该线程中的问题和答案都不清楚。

您需要向表中添加一个条目,添加另一个没有CAB文件的介质,以及比CAB文件的上一个序列多一个的LastSequence。然后,您需要用新文件替换表中的文件序列,并更新可能已更改的所有其他文件属性。

我建议您自己创建msi文件(?)


当您使用生成msi时,客户只需在替换文件后重新生成整个msi即可(wix是免费的)。否则,应该可以使用未嵌入msi的未压缩文件。在wix中,您必须添加一个没有CAB属性的文件。缺点是您必须分发两个文件,而不是一个msi。

好的,用我自己的答案重新讨论这个问题,提供了很好的小VB脚本,可以完成所有繁重的工作。正如原始问题中提到的,目的是为系统管理员用户提供一个简单的解决方案,让他们自己进行更新/更改

下面是我目前向客户提供的代码的简化版本

选项显式
Const MY_CONFIG=“MyConfigApp.xml”
Const CAB_FILE=“config.CAB”
Const MSI=“MyApp.MSI”
Dim filesys:Set filesys=CreateObject(“Scripting.FileSystemObject”)
如果filesys.FileExists(“temp.tmp”),则filesys.DeleteFile(“temp.tmp”)
filesys.CopyFile MSI,“temp.tmp”
Dim安装程序、数据库、数据库2、视图
设置installer=CreateObject(“WindowsInstaller.installer”)
Set database=installer.OpenDatabase(“temp.tmp”,1)
Set database2=installer.OpenDatabase(MSI,1)
如果没有filesys.FileExists(MY_CONFIG),那么WScript.Quit 2'没有配置文件,中止!
Dim objFile,大小,结果,序号,objCab
'MakeCab对象已被折旧,因此我们在Windows 7中回退到MakeCab.exe
错误恢复下一步“暂时禁用错误处理”
设置objCab=CreateObject(“MakeCab.MakeCab.1”)
在错误转到0'时,重新启用错误处理
如果是IsObject(objCab),则“对象创建成功-使用XP方法”
objCab.CreateCab CAB_文件,False,False,False
objCab.AddFile MY_CONFIG,filesys.GetFileName(MY_CONFIG)
闭式驾驶室
设置objCab=Nothing
Else的对象创建失败-请尝试Windows 7方法
昏暗的天气
设置WshShell=CreateObject(“WScript.Shell”)
设置oExec=WshShell.Exec(“makecab”和filesys.GetFileName(MY_CONFIG)和“&CAB_文件)
如果结束
设置objFile=filesys.GetFile(我的配置)
size=objFile.size
设置view=database.OpenView(“从DiskId=1的介质中选择LastSequence”)
查看。执行
Set result=view.Fetch
新配置文件的seq=result.StringData(1)+1'序列
设置view=database.OpenView(“插入到媒体(DiskId、LastSequence、Cabinet)值('2'、'“&seq&'、'”&CAB_FILE&“)”)
查看。执行
Set view=database.OpenView(“更新文件集FileSize=“&size&”,Sequence=“&seq&”,FileName='MYC~2.CNF | MyConfigApp.xml'其中File='”&MY_CONFIG&“'))
查看。执行
database.GenerateTransform database2,“CustomConfig.mst”
database.CreateTransformSummaryInfo database2,“CustomConfig.mst”,0,0
filesys.DeleteFile(“temp.tmp”)
设置视图=无
设置安装程序=无
设置数据库=无
设置数据库2=无
Set filesys=Nothing
WScript.0退出

更新:MakeCab.MakeCab.1对象已贬值,代码已更新,现在可以与Windows 7一起使用。

IMHO这种情况表明正在安装的应用程序中缺少一项功能,并且在应用程序中修复起来比使用MSI更容易


管理员映像 让我首先说,一个简单的方法来“解决”你的用户,是告诉他们运行你的MSI管理员安装。这将从内部CAB中提取所有文件,并将所有文件放在指定的文件夹中:

msiexec.exe/a myinstaller.msi TARGETDIR=C:\AdminImage

然后,用户可以直接进入提取的文件夹结构并更新有问题的文件,然后将目录映射到其他PC并安装MSI。这可能会对MSI中具有哈希值的文件产生副作用(以避免欺骗),但在大多数情况下效果良好


运行XML XPath查询 新版本的部署工具(如Installshield和Wix)内置了对安装期间运行XPath查询的支持,因此可以动态编写节


应用程序更新 在PC上设置应用程序需要几个步骤。首先是将内容部署到机器上——这应该使用MSI来完成,毫无疑问。但是,在大多数高级应用程序中,需要几个类似于此“配置文件更新”的“安装后配置任务”

将这些配置任务推迟到应用程序启动,而不是在MSI中实现功能,这几乎总是更好的。原因有很多,但最重要的是只有应用程序EXE才能保证在正确的用户上下文中运行。MSI文件可以使用系统权限、不同的用户帐户或通过其他机制运行

我们通常建议使用MSI将所有必需的内容获取到