65.9K
CodeProject 正在变化。 阅读更多。
Home

MSI 项目的 NewSetupVersion

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.64/5 (8投票s)

2007 年 12 月 19 日

CPOL

2分钟阅读

viewsIcon

82406

downloadIcon

1066

自动递增 MSI 安装项目的版本号。

引言

Visual Studio 支持“安装项目”,例如,从解决方案的输出创建 MSI 安装包。要更新现有安装包,而不先卸载以前的版本,需要在安装项目中手动更改一些属性。本文介绍了一个自动执行此操作的小脚本。

正则表达式用于查找要修改的项目并进行替换。因此,本文也可以被认为是 VBScript 中正则表达式的一个小示例。

背景

如果 MSI 包以前安装在电脑上,并且需要更新此包,则安装程序会提示软件版本已安装,必须先将其删除。

VS 安装项目具有“RemovePreviousVersions”属性,但仅将其设置为 True 无济于事。还需要更改版本号和产品代码。这是一个手动过程,可以使用一个小脚本在 PreBuildEvent 中自动完成。

使用代码

该脚本是用 VBScript 编写的,非常简单。任务是

  • 读取命令行中传递的项目文件,例如,Setup.vdproj
  • 备份原始文件,以防出现问题 ;-)
  • 查找版本号
  • 递增版本号
  • 将版本号替换为新值
  • 将产品代码替换为新的 GUID
  • 将包代码替换为新的 GUID
  • 将更新后的项目文件写回磁盘

正则表达式用于查找要修改的项目并进行替换。Execute 方法查找当前版本号条目。它可以从结果的 Matches 集合中提取。版本号有三个部分,用“.”作为分隔符分隔。就我而言,我只是递增版本号的最后一部分。

RegExp 对象有一个 Replace 方法来查找和修改某些内容。

有趣的是,看看如何在 VBScript 中创建新的 GUID

guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)

我还没有弄清楚为什么 GUID 有一个尾随的两个字节的垃圾,但删除它会有帮助。

这是完整的脚本

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''  Increment the version number of an MSI setup project
''  and update relevant GUIDs
''  
''  Hans-Jürgen Schmidt / 19.12.2007  
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
set a = wscript.arguments
if a.count = 0 then wscript.quit 1

'read and backup project file
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(a(0))
s = f.ReadAll
f.Close
fbak = a(0) & ".bak"
if fso.fileexists(fbak) then fso.deletefile fbak
fso.movefile a(0), fbak

'find, increment and replace version number
set re = new regexp
re.global = true
re.pattern = "(""ProductVersion"" = ""8:)(\d+(\.\d+)+)"""
set m = re.execute(s)
v = m(0).submatches(1)
v1 = split(v, ".")
v1(ubound(v1)) = v1(ubound(v1)) + 1
vnew = join(v1, ".")
'msgbox v & " --> " & vnew
s = re.replace(s, "$1" & vnew & """")

'replace ProductCode
re.pattern = "(""ProductCode"" = ""8:)(\{.+\})"""
guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)
s = re.replace(s, "$1" & guid & """")

'replace PackageCode
re.pattern = "(""PackageCode"" = ""8:)(\{.+\})"""
guid = CreateObject("Scriptlet.TypeLib").Guid
guid = left(guid, len(guid) - 2)
s = re.replace(s, "$1" & guid & """")

'write project file
fnew = a(0)
set f = fso.CreateTextfile(fnew, true)
f.write(s)
f.close

很简单,不是吗?(好吧,除了正则表达式。我总是要查找它,因为我不记得语法了......)

要在构建过程中使用脚本,只需将其放入搜索 PATH 中的任何目录即可。将 PreBuildEvent 添加到安装项目,例如

NewSetupVersion.vbs "$(ProjectDir)Setup.vdproj"

结论

上面显示的小 VBScript 对我的 MSI 安装项目很有帮助。也许它对其他人也很有用。

哦,我忘了:我目前正在使用 VS2005。这里使用的关键字可能与其他 VS 版本不同。但由于它只是“脚本”,因此可以适应几乎所有内容...

更新愉快!!!

© . All rights reserved.