Win32 利用Python批量修改解决方案中“所有项目”的版本号

举报
福州司马懿 发表于 2022/11/23 23:10:00 2022/11/23
【摘要】 需求解决方案中,有多个项目,包括多个“exe可执行程序”和多个“dll动态链接库”。做修改时,经常要修改所有项目的代码。每次修改后,都需要重新设置一个一致的版本号,然后才能正式发布每一个项目,都有4个版本号,虽然两两联动(FILEVERSION->FileVersion, PRODUCTVERSION->ProductVersion)但每个项目都要改两次版本,一旦项目多了,这也是一笔不小的...

需求

解决方案中,有多个项目,包括多个“exe可执行程序”和多个“dll动态链接库”。做修改时,经常要修改所有项目的代码。每次修改后,都需要重新设置一个一致的版本号,然后才能正式发布

每一个项目,都有4个版本号,虽然两两联动(FILEVERSION->FileVersion, PRODUCTVERSION->ProductVersion)但每个项目都要改两次版本,一旦项目多了,这也是一笔不小的工作量

图片.png

因此,我们提倡用python来解决这种批量的作业

解决方案

思路

  1. 将python文件放置于解决方案目录下
  2. 通过python查找同级目录中的所有文件夹
  3. 由于rc文件的文件名与项目名相同,因此在当前目录下的所有文件夹后面拼接上改文件夹的名称,然后以.rc作为文件后缀,如果该文件存在,则为项目的资源文件(版本号就在其中)
  4. 按行读取rc文件,如果该行存在版本号,则进行替换并写入临时文件
  5. 用临时文件替换原rc文件
  6. 执行完成

代码

推荐使用anacondaspyder编辑器

#!/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('执行结束')

图片.png

注意

读取时使用的文件类型,跟你项目的文件保存类型有关,Vistual Studio 默认用的是utf-16-le

如果你调出了“高级保存选项”,并将文件类型默认为UTF8,那么python读取的文件类型,也要对应的改为utf-8

图片.png

图片.png

如果使用的文件类型,和文件实际类型不一致,就会报如下错误
图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。