Win32 利用Python批量修改解决方案中“所有项目”的版本号
【摘要】 需求解决方案中,有多个项目,包括多个“exe可执行程序”和多个“dll动态链接库”。做修改时,经常要修改所有项目的代码。每次修改后,都需要重新设置一个一致的版本号,然后才能正式发布每一个项目,都有4个版本号,虽然两两联动(FILEVERSION->FileVersion, PRODUCTVERSION->ProductVersion)但每个项目都要改两次版本,一旦项目多了,这也是一笔不小的...
需求
解决方案中,有多个项目,包括多个“exe可执行程序”和多个“dll动态链接库”。做修改时,经常要修改所有项目的代码。每次修改后,都需要重新设置一个一致的版本号,然后才能正式发布
每一个项目,都有4个版本号,虽然两两联动(FILEVERSION->FileVersion, PRODUCTVERSION->ProductVersion)但每个项目都要改两次版本,一旦项目多了,这也是一笔不小的工作量
因此,我们提倡用python来解决这种批量的作业
解决方案
思路
- 将python文件放置于解决方案目录下
- 通过python查找同级目录中的所有文件夹
- 由于rc文件的文件名与项目名相同,因此在当前目录下的所有文件夹后面拼接上改文件夹的名称,然后以
.rc
作为文件后缀,如果该文件存在,则为项目的资源文件(版本号就在其中) - 按行读取rc文件,如果该行存在版本号,则进行替换并写入临时文件
- 用临时文件替换原rc文件
- 执行完成
代码
推荐使用anaconda
的spyder编辑器
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os,sys
#打开文件
def open_file(fileName, flag):
try:
f = open(fileName, flag, encoding='utf-16-le')
return f
except BaseException:
return None
return None
#文件重命名
def os_rename(src, dst):
try:
os.rename(src, dst);
except FileExistsError:
os.remove(dst);
os.rename(src, dst);
# 获取所有RC文件
def get_rc():
rcs = []
for f in os.listdir('.'):
if os.path.isdir(f):
# 项目的rc文件与项目隶属同一个名字
rc = os.path.join(f,f) + '.rc'
if(os.path.exists(rc)):
rcs.append(rc)
return rcs
# 替换版本号
def replace_ver(rc, ver):
newLine = '\n'
commaVer = ver.replace('.', ',')
tmp = rc + '.tmp'
fr = open_file(rc, 'r')
fw = open_file(tmp, 'w')
# 只有当读和写都正常的时候,才继续执行
ret = fr and fw
if ret:
line = fr.readline()
# 逐行读取,并替换版本号
while line:
if(line.startswith(' FILEVERSION')):
line = ' FILEVERSION ' + commaVer + newLine
elif(line.startswith(' PRODUCTVERSION')):
line = ' PRODUCTVERSION ' + commaVer + newLine
elif(line.startswith(' VALUE "FileVersion"')):
line = ' VALUE "FileVersion", "' + ver + '"' + newLine
elif(line.startswith(' VALUE "ProductVersion"')):
line = ' VALUE "ProductVersion", "' + ver + '"' + newLine
fw.write(line)
line = fr.readline()
if fr:
fr.close()
if fw:
fw.close()
# 如果执行成功,用写入的文件替换原文件
if ret:
os_rename(tmp, rc)
if __name__ == '__main__':
if len(sys.argv) > 1:
ver = sys.argv[1]
else:
ver = '1.0.0.0'
print(ver)
for rc in get_rc():
replace_ver(rc, ver)
print('执行结束')
注意
读取时使用的文件类型,跟你项目的文件保存类型有关,Vistual Studio 默认用的是utf-16-le
如果你调出了“高级保存选项”,并将文件类型默认为UTF8,那么python读取的文件类型,也要对应的改为utf-8
如果使用的文件类型,和文件实际类型不一致,就会报如下错误
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)