如何从 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“文件”表中提取数据(文件计数) 的相关文章

  • 用于配置编辑的 wix 自定义对话框

    你好 我正在尝试使用 wix v3 为我的应用程序设置 msi 我对这项任务有疑问 我需要一个用户输入 该输入将存储在我的应用程序的配置文件中 例如 我需要一个用于 sql 连接字符串的对话框 并且用户输入将写入应用程序配置文件中 我尝试用
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同
  • WIX 目标文件由 LFN 系统上的两个不同组件安装在 [ProgramFilesFolder] 中:这会破坏组件引用计数

    我正在使用 WIX 通过 TFS MSBuild 生成 msi 破坏构建的错误 不仅仅是警告 是 ICE30 The target file eiycriw9 exe MyApp exe is installed in ProgramFil
  • MSI 安装程序,64 位操作系统,写入 \windows\system32\inetsrv 文件夹

    在 Windows Server 2008 64 位上 我需要一个 msi 安装程序文件来将一些文件写入 windows system32 inetsrv 文件夹 这些文件是一些 XML 架构验证文件 C XmlReaderSettings
  • 如何为 WIX 中的目录分配路径值?

    在我的 WIX 项目中 我有一个类似这样的目录结构
  • 验证服务是否被标记为删除

    有时 当我卸载安装程序 使用 WIX 创建的 时 服务仍标记为删除 用户必须重新启动计算机才能再次安装 我如何验证该服务是否已标记为删除并告诉用户在进行其他安装之前重新启动计算机 一般来说 当某项服务仍然锁定在该服务上 从而阻止 Windo
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • 对 .NET Windows 安装程序应用程序执行注册表搜索

    我有一个 NET winform 安装程序应用程序 在安装之前 我会进行注册表搜索以检查计算机上是否安装了 MS Access Runtime 搜索目标机器 搜索目标机器的属性 启动条件 启动条件的属性 但是我想避免对路径进行硬编码 例如
  • Wix 4 收获目录的解释?

    我正在尝试学习 Wix 4 0 来为我正在开发的应用程序创建安装程序 构建我的应用程序后 我在一个文件夹中有一堆文件 我想将它们安装到程序文件中 我已经读到收获功能允许我简化此过程并为整个目录创建组件映射 但我不确定这是什么example
  • 如何禁用恢复 Visual Studio 安装程序项目丢失的文件?

    我创建了一个使用来自暴雪 API 服务的图像的程序 我为该程序创建了一个安装程序 并将图像放置在 用户的应用程序数据文件夹 中 安装非常好 图像被解压到文件夹 AppData Roaming MyApp 中 如果需要删除图像 程序将从暴雪服
  • 让 WiX Bootstrapper 用于 .NET 4.0 的引导

    我一直在寻找让我的引导程序能够安装 NET 4 0 和我自己的应用程序 我查看了几个博客和教程 但无法让它发挥作用 我在 Stack Overflow 问题中读到在 WiX 中启动 调用引导程序 https stackoverflow co
  • 如何引导 SQL Server 2008 Express SP1?

    我正在尝试将 SQL Server 2008 Express SP1 引导到我的应用程序中 之前我使用 Wise for Windows 来执行必备安装 但 Wise 尚不支持 Windows Installer 4 5 我现在尝试将 Vi
  • WiX Installer:获取正在升级的产品版本

    在从版本 X 到版本 Y 的主要升级过程中 我需要一个属性 变量来表明版本 X 正在升级 当使用 WiX Installer 构建的安装程序对产品进行主要升级时 是否有办法获取正在升级的版本号 假设您使用 WiX Majorupgrade
  • 如何在 MSBuild 中创建新属性并在 WIX 中引用它

    我们需要创建一个属性来指示我们的软件版本 然后我们想在我们的 WIX 项目中使用它 即在 wxs 文件中引用它 我们不想在 wxs 文件中定义它 因为我们希望 MSBuild 也根据此版本号重命名输出文件 PropertyGroup 中的常
  • WiX Heat:预构建事件在构建服务器上过早触发

    我正在为我的 Visual Studio 解决方案收集一个目录 到目前为止 它在我的本地系统上运行可能是因为项目构建顺序得到了尊重 当我在构建服务器上运行安装程序时 它会找到正确的目录 但在构建安装文件时尚未创建该目录 它抛出一个HEAT5
  • 安装后如何执行Wix自定义操作?

    我正在使用 Wix3 将 WCF 服务安装到 IIS 安装完成后如何使用我的自定义操作 c 函数 即我需要打开已安装的 web config 文件并将主机名替换为真实的主机名 有任何想法吗 您可以安排在之后安装完成 http wix sou
  • WiX:如何立即重新启动explorer.exe?

    我是软件打包方面的初学者 我正在使用 cpack Wix 我试图找到有关的有用信息或良好文档util 重启资源 但找不到我的问题的任何答案 Issue 我必须安装一个 ShellExtension 它需要在设置一些注册表值后重新启动 exp
  • 良好的 WiX 编辑器 [重复]

    这个问题在这里已经有答案了 我目前正在开发一个使用 WiX 创建 MSI 的项目 我过去在 Sourceforge 上使用 WiXEdit 来管理包含在 WiX 项目中的文件 因为它比直接操作 XML 稍微容易一些 但它仍然有点笨重 有谁知
  • 如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表?

    Update 有趣的是 如果我运行 32 位 powershell 来运行脚本 它会给我同样的错误 看起来32位powershell无法访问64位注册表树 我尝试使用WixQuietExec64但它给出了同样的错误 我还尝试提供 power
  • WIX 捆绑包创建

    我尝试创建一个包含 exe 的 MSI 使用 WIX 中的捆绑选项 这样做时出现错误 有人可以帮我解决这个问题吗 下面是代码

随机推荐

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

    我有一个可以轻松比较的元素列表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 目标中执行以下操作 获取所有已