【问题标题】:Update MSI properties programmatically以编程方式更新 MSI 属性
【发布时间】:2025-12-05 16:55:02
【问题描述】:

我需要一个解决方案来解决可能相当简单的问题 - 更新 MSI 属性。我们有许多在 TFS 2012 中受源代码控制的 WiX 项目,我们通过 TeamCity 构建配置生成它们相关的 MSI 以进行部署,这些构建配置通常构建所需的 *.wixproj 文件。

在 TFS/Visual Studio 中更新 MSI 属性根本不是一种选择,因为我们需要将更改限制在 TeamCity,因为我们当前是如何设置整个持续集成和部署过程的。

因此,我希望实现的是一种解决方案,在该解决方案中,我可以在创建所需的 MSI 属性后运行脚本或命令来更新它。我欢迎使用来自 Powershell、Perl、VBScript、Windows Batch 脚本等的任何脚本或命令的解决方案,因为这将设置为 TeamCity 构建的最终步骤,以修改创建的 MSI。

谢谢。

【问题讨论】:

    标签: wix installation windows-installer


    【解决方案1】:

    您可以使用msiinfo.exe(它是 Windows SDK 的一部分)来读取/添加/更新 msi 属性。

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\MsiInfo.Exe>msiinfo.exe /?
    MsiInfo V 5.0
    Copyright (c) Microsoft Corporation. All Rights Reserved
    
    ++MsiInfo.exe Command Line Syntax++
    MsiInfo.exe {database} --> To Display Summary Info Properties
    MsiInfo.exe {database} Options.... --> To Set Summary Info Properties
    ++MsiInfo.exe Options++
    PID_DICTIONARY   - /I {value}
    PID_CODEPAGE     - /C {value}
    PID_TITLE        - /T {value}
    PID_SUBJECT      - /J {value}
    PID_AUTHOR       - /A {value}
    PID_KEYWORDS     - /K {value}
    PID_COMMENTS     - /O {value}
    PID_TEMPLATE     - /P {value}
    PID_LASTAUTHOR   - /L {value}
    PID_REVNUMBER    - /V {value}
    PID_EDITTIME     - /E {value}
    PID_LASTPRINTED  - /S {value}
    PID_CREATE_DTM   - /R {value}
    PID_LASTSAVE_DTM - /Q {value}
    PID_PAGECOUNT    - /G {value}
    PID_WORDCOUNT    - /W {value}
    PID_CHARCOUNT    - /H {value}
    PID_THUMBNAIL    - NOT SUPPORTED
    PID_APPNAME      - /N {value}
    PID_SECURITY     - /U {value}
    Validate String Pool - [/B] /D  (use /B to display the string pool)
    /?               - Displays this help message
    /nologo          - Do not display the logo message
    

    例如,您可以如下设置作者和主题属性:

    msiinfo.exe my.msi /A "Your name" /J "This is a demo"
    

    请注意,您不能使用 msiinfo.exe my.msi /I 读取单个属性,因为它会尝试更新属性(实际上是清除值)。

    【讨论】:

      【解决方案2】:

      假设您的意思是要修改先前构建的 MSI 文件中的 MSI 属性,然后基本上在 Windows Kit/SDK 中找到 WinRunSQL.vbs 文件,然后学习 SQL 命令以更新属性表中的属性。这里有例子:http://msdn.microsoft.com/en-us/library/aa372021(v=vs.85).aspx

      我假设您对 MSI 有足够的了解,知道您所指的属性很可能是属性表中的属性。

      【讨论】:

      • 我同意,但我认为 DTF 会更容易吗?
      【解决方案3】:

      也许您可以尝试使用 DTF(部署工具基金会)。我已经在this answer on serverfault 中写过它。请点击链接了解更多信息。

      【讨论】:

        【解决方案4】:

        感谢您的所有好评。

        我实际上找到了一个 VBScript 解决方案,它通过更新我之前构建的 MSI 的所需属性来出色地完成这项工作。我已将其设置为在前面的 Team City 构建步骤中创建我的 MSI 之后运行的构建步骤。

        很遗憾,我将脚本保存在我的办公室 PC 上,因此目前无法访问它以进行共享。但是,当我在这个周末之后在办公室时,我会这样做。

        【讨论】:

        • VBScript 非常适合轻量级的更改。请务必阅读链接的 serverfault 答案中的信息,随着使用 DTF 和 C# 的需求增长,您可以更轻松地进行调试。