如何从 MSI“文件”表中提取数据(文件计数)

2023-11-22

在我们的构建过程中,当前有可能将基于非代码的文件(例如图像文件)添加到我们的 Web 项目中,但不包含在 WiX 构建的 MSI 安装程序中。

为了帮助防止这种情况,我想在 WiX 项目的 AfterBuild 目标中执行以下操作:

  • 获取所有已构建文件的计数(Web 部署项目的输出)
  • 获取 MSI 中内置的所有文件的计数(来自 MSI 中的“文件”表)
  • 比较计数,如果不匹配则构建失败

如果我启动 Orca,我可以轻松查看文件表并进行计数,但我不知道如何从 MSBuild 自动化此操作。是否有一些 API 或其他机制可以从 MSI 中获取此信息?

我不介意编写自定义 MSBuild 任务来提取 MSI 文件表计数。


新建一个Visual Studio项目,添加引用c:\windows\system32\msi.dll并使用以下代码读取msi文件中的文件数量:

Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
var installer =
   (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
var msi = installer.OpenDatabase(@"path\to\some\file.msi", 0);
var fileView = msi.OpenView("SELECT FileName FROM File");
fileView.Execute(null);
int fileCount = 0;
while (fileView.Fetch() != null)
{
   fileCount++;
}
Console.WriteLine(fileCount);

这段代码使用了WindowsInstaller.InstallerCOM 对象,它是 Windows 安装程序自动化 API 的入口点。看看完整的参考文档.

edit:显然 wix 带有托管程序集(在C:\program files\Windows Installer XML v3\sdk)它包装 msi.dll。我想这就是 Rob 在他的回答中所说的“DTF”。使用 Microsoft.Deployment.WindowsInstaller 程序集和命名空间中的类型会将代码示例简化为:

var database = new Database(@"\path\to\some\file.msi");
var list = database.ExecuteQuery("SELECT FileName FROM File");
Console.WriteLine(list.Count);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 MSI“文件”表中提取数据(文件计数) 的相关文章

随机推荐

  • 在某些条件下随机播放列表

    我有一个可以轻松比较的元素列表Equals 我必须对列表进行洗牌 但洗牌必须满足一个条件 第 i 个元素shuffledList i 不得等于以下位置的元素i 1也不是元素i 2 该清单应被视为循环 也就是说 列表中的最后一个元素后面跟着第
  • grep 查找包含“\t”的行

    我被要求制作一个 shell 脚本来检查文件中的简单错误 我想找到 对于每一行 如果 正则表达式 t 曾经发生过 问题是 grep 忽略了 并将 t 作为文字 我还尝试将字符本身写入文件并要求 grep 读取它 但它不起作用 有没有办法使用
  • iPhone 操作系统:如何以编程方式区分 iPad 3G 和 iPad Wi-Fi?

    iPhone OS 中是否有任何属性或其他机制可以在运行时检查应用程序是否在 iPad 3G 或 iPad Wi Fi 上运行 似乎 UIDevice 类没有提供类似的东西 我的应用程序广泛使用互联网访问 我想明确警告用户 在 3G 上可能
  • Fragment onCreateView 和 onActivityCreated 调用两次

    我正在使用 Android 4 0 ICS 和片段开发一个应用程序 请考虑 ICS 4 0 3 API 级别 15 API 演示示例应用程序中的修改示例 public class FragmentTabs extends Activity
  • 带有 SVG 颜色渐变的圆形进度指示器?

    我需要制作一个带有颜色渐变的圆形进度指示器 我还需要将进度圈的 末端 弄圆 这张图片包含了我想要实现的一切 此代码很接近 但没有颜色渐变 https codepen io adsfdsfhdsafkhdsafjkdhafskjds pen
  • 将变量从容器开始传递到文件

    我在 Dockerfile 中有以下几行 我想在应用程序最后启动之前将配置文件中的值设置为默认值 并提供可选的使用 e启动容器时的选项 我正在尝试使用 Docker 来做到这一点ENV突击队 ENV CONFIG VALUE default
  • 我使用的是哪个版本的 Kohana?

    Kohana框架中哪里可以找到版本信息 我在教程中看到的所有内容都与我在应用程序中看到的内容相反 我认为这是一个版本问题 因为文档和我的安装之间的方法和调用略有不同 至少对于 gt 3 0 的版本 Kohana 的版本号位于system c
  • Applescript 右键单击​​文件

    苹果脚本中是否有一个命令可以右键单击文件并调出上下文菜单 我正在寻找类似的东西 tell application Finder set theDesktopItems to every item of desktop right click
  • 如何逃脱液体模板标签?

    这听起来很简单 但是我在文档中找不到它 我怎样才能写 this in a liquid模板 未经引擎处理 可以使用以下命令禁用液体处理引擎raw tag raw this endraw 将显示 this
  • 将 Node.js 应用程序(托管在 GAE 上)的 IP 列入白名单以访问 MongoDB Atlas(托管在 GCP 上)

    我希望我的后端服务器 Node js 托管在 Google App Engine 上 灵活的环境 如果重要的话 能够从我的数据库 MongoDB 通过 Atlas 也托管在同一区域的 Google Cloud 平台上 获取和传递数据作为我的
  • 如何配置 flot 以在 y 轴零点处绘制缺失的时间序列?

    我正在使用浮点 github上的浮动 用以下时间序列数据绘制图表 1357171200000 1 1357344000000 1 1357430400000 2 1357516800000 2 1357689600000 3 1357776
  • 如何在Magento中连接多个外部数据库? [关闭]

    Closed 这个问题是无关 目前不接受答案 我需要从 Magento 连接到一些外部数据库 我找到了一个教程在 Magento 中创建外部数据库连接 本教程很有帮助 它适用于连接到一个外部数据库 但是 我必须连接多个外部数据库 如何在 M
  • django.core.paginator 使用 jQuery 进行 Ajax 分页

    Problem 我需要在 Django 模板中使用 jQuery 进行 Ajax 分页 情况 我的模板中有以下代码 code omitted table table
  • PHP spl_自动加载

    我真的没有得到 spl autoload 的文档 bool spl autoload register callback autoload function 根据我的理解 当 php 遇到尚未加载的类时 它将尝试运行注册的函数 例如 pub
  • 我可以使用 open_basedir 访问 /dev/urandom 吗?

    我想在 Codeigniter 中使用 phpass 0 3 但由于以下原因出现以下错误open basedir 遇到 PHP 错误严重性 警告消息 is 可读 函数 可读 open basedir 限制生效 文件 dev urandom
  • 为什么 Google API V3 不返回子级?

    我想使用 Python 获取 Google Drive 中给定文件夹中的所有文件 文件夹的列表 我正在使用的调用是这样的 query parentID in parents response service files list q que
  • 自定义创建的方法错误:“不是函数”

    我有一个英雄按钮列表 其中创建了自定义动画button component ts 一开始 他们是不活跃的 当我按下其中之一时 所选的应该变为活动状态 为此 我创建了一个字段hero ts called state和一个名为的函数toggle
  • 使用 css 按对角线分割双色调背景

    我正在尝试使用 css 创建一个背景 其中一侧是纯色 另一侧是纹理 两者被对角线分开 我希望这是 2 个独立的 div 因为我计划使用 jQuery 添加一些动作 如果您单击右侧 灰色三角形会变小 如果您单击左侧 纹理三角形会变小 就像窗帘
  • Safari 为 Silverlight (NPAPI) 计划的生命周期是怎样的

    Chrome 已经放弃了 NPAPI silverlight 支持 Firefox 宣布将于 2016 年底停止对 NPAPI 支持 https blog mozilla org futurereleases 2015 10 08 npap
  • 如何从 MSI“文件”表中提取数据(文件计数)

    在我们的构建过程中 当前有可能将基于非代码的文件 例如图像文件 添加到我们的 Web 项目中 但不包含在 WiX 构建的 MSI 安装程序中 为了帮助防止这种情况 我想在 WiX 项目的 AfterBuild 目标中执行以下操作 获取所有已