gpt4 book ai didi

vbscript - 如何在VBScript中解析MSI路径?

转载 作者:行者123 更新时间:2023-12-02 06:28:46 25 4
gpt4 key购买 nike

我正在寻找使用VBScript在MSI外部解析MSI中文件的路径,无论是否安装(以较快者为准)。

我发现使用C#代替了类似的查询,而Christpher在下面提供了一个解决方案:How can I resolve MSI paths in C#?

我现在正经历着同样的痛苦,但是无论如何还是要在VBScript中使用WindowsInstaller对象来实现这一点,而不是通过MSI的SQL表来回查询无止境地实现相同的目的。尽管任何方向都是欢迎的,因为我尝试过测试,但我取得的成功非常有限。

最佳答案

是的,没有安装msi并使用vbscript的解决方案。
Windows Installer SDK中有一个很好的示例,名为“ WiFilVer.vbs”

使用该示例,我整理了一个快速示例脚本,该脚本可以完全满足您的需求。

set installer = CreateObject("WindowsInstaller.Installer")
const READONLY = 0

set db = installer.OpenDataBase("<FULL PATH TO YOUR MSI>", READONLY)
set session = installer.OpenPackage(db, READONLY)
session.DoAction("CostInitialize")
session.DoAction("CostFinalize")

set view = db.OpenView("SELECT File, Directory_, FileName, Component_, Component FROM File,Component WHERE Component=Component_ ORDER BY Directory_")
view.Execute
set record = view.Fetch

do until record is nothing
file = record.StringData(1)
directoryName = record.StringData(2)
fileName = record.StringData(3)
if instr(fileName, "|") then fileName = split(fileName, "|")(1)
wsh.echo(session.TargetPath(directoryName) & fileName)
set record = view.Fetch
loop


只需将路径添加到您的MSI文件即可。

告诉我是否需要更详细的答案。今晚我将有更多时间详细回答这个问题。

编辑承诺的背景(以及为什么我需要致电ConstFinalize)

naveen实际上是MSDN上唯一可以给出确切答案的资源,但是由于Windows安装程序是恕我直言的一个非常复杂的话题,因此您需要知道外观和外观。
我真的建议混合使用msdn installer function referencedatabase reference和Windows Installer SDK中的示例(对不起,找不到下载链接,我认为它隐藏在3GB Windows SDK之类的地方)

首先,您需要MSI的常识:

MSI实际上是一个关系数据库。
一切都存储在相互关联的表中。
(实际上不是所有内容,但我会尽量简化;))

Windows安装程序会解释此数据库,
这创建了一个“会话”

还可以动态解析某些部分,具体取决于安装了msi的系统,
例如类似于环境变量的“特殊”文件夹。
例如。 msi具有一个“ ProgramFilesFolder”,其中Windows通常具有%ProgramFiles%。

所有动态内容仅存在于Installer会话中,而不存在于数据库本身中。

对于您的情况,您需要查看3个表,注意关系并解决它们。

“文件”表包含所有文件,“组件”表告诉您哪个文件进入哪个目录,“目录”表包含有关文件系统结构的所有信息。

使用SQL查询,我可以链接Component和File表以找到目录名称(或数据库术语中的主键)。

但是目录表本身具有关系,其结构像树一样。
看一下这个示例目录表(摘自instEd MSI)

列是目录,Directory_Parent和DefaultDir

InstEdAllUseAppDat  InstEdAppData   InstEd
INSTALLDIR InstEdPF InstEd
CUBDIR INSTALLDIR hkyb3vcm|Validation
InstEdAppData CommonAppDataFolder instedit.com
CommonAppDataFolder TARGETDIR .
TARGETDIR SourceDir
InstEdPF ProgramFilesFolder instedit.com
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
SendToFolder TARGETDIR .
WindowsFolder_x86_VC.1DEE2A86_2F57_3629_8107_A71DBB4DBED2 TARGETDIR Win
SystemFolder_x86_VC.1DEE2A86_2F57_3629_8107_A71DBB4DBED2 WindowsFolder_x86_VC.1DEE2A86_2F57_3629_8107_A71DBB4DBED2 System


directory_parent将其链接到目录。 DefaultDir包含实际名称。
您现在可以自己解析树并替换所有特殊文件夹(在vbscript中这将非常乏味)...

...或让Windows Installer处理该问题(就像安装MSI一样)。
现在我必须介绍一个新事物:动作(和序列):
当运行(安装,删除,修复)MSI时,将执行定义的操作列表。
有些动作只是收集信息,有些则更改实际的数据库。

列出了微星可以做的各种动作(称为序列),
例如一种安装序列(称为InstallExecuteSequence),一种用于从用户收集信息(MSI的UI:InstallUISequence)或一种用于管理点安装(AdminExecuteSequence)的序列。

在我们的情况下,我们不想运行整个序列(这可能会改变系统或花费很长时间),
幸运的是,Windows安装程序使我们可以运行单个操作而无需运行整个序列。
阅读 reference of the directory table on MSDN(“备注”部分),您可以看到需要执行的操作:

Directory resolution is performed during the CostFinalize action


因此将所有这些脚本放在一起更容易阅读
*打开msi文件
*“解析”它(提供会话)
*查询组件和文件表
*运行CostFinalize操作来解析目录表(不运行整个MSI)
*使用targetPath函数获取解析路径

顺便说一句,我通过浏览MSDN上的Installer Reference找到了targetPath函数。
我也刚刚注意到,不需要CostInitialize。仅当您要获取文件的sourcePath时才需要它。

我希望这可以使一切变得更清晰,很难解释,因为我自己花了半年的时间才能自己理解它;)

关于PhilmE,答案是:
是的,像自定义操作一样,对目录表的解析有更多影响。
请记住,管理安装可能会导致出现不同的目录(例如,因为不同的顺序可能会包含不同的自定义操作)。
组件具有条件,因此可能根本没有安装文件。
我很确定InstEd也不会考虑自定义操作。

是的,没有100%的解决方案。也许有必要混合所有内容。

关于vbscript - 如何在VBScript中解析MSI路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com