使用python脚本批量修改vc工程文件
作者:朱金灿
来源:clever101的专栏
为什么大多数人学不会人工智能编程?>>>
问题描述
vc工程文件中的很多属性设置,比如输出目录、中间目录和输出文件名等等。使用vs单独操作设置较为繁琐,如果几十甚至上百个工程操作就更为繁琐了。于是决定编写一个python脚本来实现批量修改vc工程文件。
实现思路
首先我们打开一个vc工程文件,可以发现它本质上的一个xml文件。如下:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ItemGroup Label="ProjectConfigurations"><ProjectConfiguration Include="Debug|Win32"><Configuration>Debug</Configuration><Platform>Win32</Platform></ProjectConfiguration><ProjectConfiguration Include="Release|Win32"><Configuration>Release</Configuration><Platform>Win32</Platform></ProjectConfiguration><ProjectConfiguration Include="Debug|x64"><Configuration>Debug</Configuration><Platform>x64</Platform></ProjectConfiguration><ProjectConfiguration Include="Release|x64"><Configuration>Release</Configuration><Platform>x64</Platform></ProjectConfiguration></ItemGroup><PropertyGroup Label="Globals"><ProjectGuid>{E23129FC-0417-462C-890C-D0EC20E735AB}</ProjectGuid><Keyword>Win32Proj</Keyword><RootNamespace>WatermarkAssist</RootNamespace><WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries><PlatformToolset>v140</PlatformToolset><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries><PlatformToolset>v140</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries><PlatformToolset>v140</PlatformToolset><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"><ConfigurationType>DynamicLibrary</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries><PlatformToolset>v140</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>Unicode</CharacterSet></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /><ImportGroup Label="ExtensionSettings"></ImportGroup><ImportGroup Label="Shared"></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><PropertyGroup Label="UserMacros" /><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><LinkIncremental>true</LinkIncremental><OutDir>D:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\plug_ins</OutDir><IntDir>..\..\..\Intdir\$(Configuration)_$(Platform)\$(ProjectName)</IntDir><TargetExt>.api</TargetExt></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><LinkIncremental>true</LinkIncremental></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><LinkIncremental>false</LinkIncremental></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><LinkIncremental>false</LinkIncremental></PropertyGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><ClCompile><PrecompiledHeader></PrecompiledHeader><WarningLevel>Level3</WarningLevel><Optimization>Disabled</Optimization><PreprocessorDefinitions>_DEBUG;WIN_PLATFORM;WIN32;_WINDOWS;WIN_ENV;ACRO_SDK_LEVEL=0x00060000;%(PreprocessorDefinitions)</PreprocessorDefinitions><AdditionalIncludeDirectories>..\..\Headers\SDK;..\..\Headers\API;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories></ClCompile><Link><SubSystem>Windows</SubSystem><GenerateDebugInformation>true</GenerateDebugInformation><AdditionalOptions>/EXPORT:PlugInMain</AdditionalOptions></Link></ItemDefinitionGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><ClCompile><PrecompiledHeader></PrecompiledHeader><WarningLevel>Level3</WarningLevel><Optimization>Disabled</Optimization><PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;WATERMARKASSIST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile><Link><SubSystem>Windows</SubSystem><GenerateDebugInformation>true</GenerateDebugInformation></Link></ItemDefinitionGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><ClCompile><WarningLevel>Level3</WarningLevel><PrecompiledHeader></PrecompiledHeader><Optimization>MaxSpeed</Optimization><FunctionLevelLinking>true</FunctionLevelLinking><IntrinsicFunctions>true</IntrinsicFunctions><PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WATERMARKASSIST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile><Link><SubSystem>Windows</SubSystem><EnableCOMDATFolding>true</EnableCOMDATFolding><OptimizeReferences>true</OptimizeReferences><GenerateDebugInformation>true</GenerateDebugInformation></Link></ItemDefinitionGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><ClCompile><WarningLevel>Level3</WarningLevel><PrecompiledHeader></PrecompiledHeader><Optimization>MaxSpeed</Optimization><FunctionLevelLinking>true</FunctionLevelLinking><IntrinsicFunctions>true</IntrinsicFunctions><PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;WATERMARKASSIST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions></ClCompile><Link><SubSystem>Windows</SubSystem><EnableCOMDATFolding>true</EnableCOMDATFolding><OptimizeReferences>true</OptimizeReferences><GenerateDebugInformation>true</GenerateDebugInformation></Link></ItemDefinitionGroup><ItemGroup><ClCompile Include="PIMain.c" /><ClCompile Include="WatermarkAssist.cpp" /><ClCompile Include="WatermarkAssistInit.cpp" /></ItemGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /><ImportGroup Label="ExtensionTargets"></ImportGroup>
</Project>
因此我们使用python的xml解析库就可以解决问题了。我们看到这个xml文件也是比较容易读懂的,比如Condition="’$(Configuration)|$(Platform)’==‘Debug|Win32’">节点下的<OutDir>节点就是设置输出目录的,<IntDir>节点就是设置临时目录的。
关键代码
代码不复杂,关键有两处。一是使用python的xml解释库xml.etree.ElementTree解析vc工程文件之前需要先注册命名空间,代码如下:
ET.register_namespace('', "http://schemas.microsoft.com/developer/msbuild/2003")
二是脚本中的find_nodes函数的使用,调用代码如下:
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ElementTree,Element
#修改vc工程的输出目录和中间目录、设置输出文件名、pdb文件和导入库文件
def ModifyPrjProperty(tree):
#find_nodes函数负责找到PropertyGroup节点下的所有子节点nodes = find_nodes(tree, '{http://schemas.microsoft.com/developer/msbuild/2003}PropertyGroup')for groupNode in nodes:propertyNodes = groupNode.getchildren()#遍历子节点for propertyNode in propertyNodes:if propertyNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}OutDir':print 'finded OutDir'#propertyNode.text = "..\..\\..\\..\\OutDir\\$(Configuration)_$(Platform)"propertyNode.text = "D:\\Program Files (x86)\\Adobe\Acrobat 11.0\\Acrobat\\plug_ins"continueif propertyNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}IntDir':print 'finded IntDir'propertyNode.text = "..\..\..\..\Intdir\$(Configuration)_$(Platform)\$(ProjectName)"continuenodes = find_nodes(tree, '{http://schemas.microsoft.com/developer/msbuild/2003}ItemDefinitionGroup')for groupNode in nodes:propertyNodes = groupNode.getchildren()for propertyNode in propertyNodes:if propertyNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}ClCompile':ClCompileNodes = propertyNodefor ciNode in ClCompileNodes:if ciNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}AssemblerListingLocation':print 'finded AssemblerListingLocation'ciNode.text = "$(IntDir)"continueif ciNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}ObjectFileName':print 'finded ObjectFileName'ciNode.text = "$(IntDir)"continueif ciNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}ProgramDataBaseFileName':print 'finded ProgramDataBaseFileName'ciNode.text = "$(IntDir)vc$(PlatformToolsetVersion).pdb"continueif ciNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}RuntimeLibrary':print 'finded RuntimeLibrary'ciNode.text = "MultiThreadedDebugDLL"continueif propertyNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}Link':LinkNodes = propertyNodefor linkNode in LinkNodes:if linkNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}OutputFile':print 'finded OutputFile'linkNode.text = "$(OutDir)\\$(ProjectName).api"continueif linkNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}ProgramDatabaseFile':print 'finded ProgramDatabaseFile'linkNode.text = "$(OutDir)\\$(ProjectName).pdb"continueif linkNode.tag == '{http://schemas.microsoft.com/developer/msbuild/2003}ImportLibrary':print 'finded ImportLibrary'linkNode.text = "$(IntDir)\\$(ProjectName).lib"continue
if __name__ == "__main__":ET.register_namespace('',"http://schemas.microsoft.com/developer/msbuild/2003")tree = ElementTree()priFileFile = 'D:\\MyProject\\test.vcxproj'tree.parse(priFileFile)#ModifyPrjOutputAndIntDir(tree)ModifyPrjProperty(tree)
完整的脚本代码已上传到CSDN下载频道,下载地址:用于批量修改VC工程文件的python脚本。
使用python脚本批量修改vc工程文件相关推荐
- Python脚本-批量修改文件名
Notice1:os.listdir(path) filenames = os.listdir(path) os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以 ...
- 使用python脚本批量修改Arcgis的数据字段类型或者名称
参考其他的文章,放上代码,直接使用arcgis自带的python IDE运行,可解决中文字符的问题. # -- coding: utf-8 -- import arcpy import sys fro ...
- python脚本批量修改图片像素大小和重命名
可能对学习FCN和CNN的同学有点帮助 Resize程序 def resize(f):rgb=io.imread(f) #依次读取rgb图片#gray=color.rgb2gray(rgb) #将rg ...
- python数据库操作批量sql执行_利用Python如何批量修改数据库执行Sql文件
利用Python如何批量修改数据库执行Sql文件 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 利用Python如何批量修改数据库执行Sql文件.txt ] (友 ...
- Python自动批量修改文件名称的方法大全
前言 本文介绍基于Python语言,按照一定命名规则批量修改多个文件的文件名的方法.已知现有一个文件夹,其中包括班级所有同学上交的作业文件,每人一份:所有作业文件命名格式统一,都是地信1701_姓名_ ...
- python docx 批量修改docx文件内容和选择位置添加内容
#-*- encoding:utf_8 -*- from docx import Document from docx.shared import Inches from log import log ...
- Python OpenCV 批量修改文件夹内所有图片的尺寸
Python OpenCV 批量修改文件夹内所有图片的尺寸 简述 插件 遍历所有文件(包括子文件) 缩放图片尺寸并保存图片 遍历并修改图片 简述 遍历文件夹下的所有子文件(包括自文件夹内的)的图片批量 ...
- iOS使用shell脚本批量修改属性
背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,除了我在上一篇文章中说道的在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝.还有另一种 ...
- Python脚本批量重命名图片
Python脚本批量重命名图片 # -*- coding: utf-8 -*- """ Created on Tue Mar 23 13:34:59 2021@autho ...
最新文章
- Apache Tomcat 7.x 概述
- CCF C³:创业公司如何面对开源?知乎CTO李大海:谢邀
- Kafka如果丢了消息,怎么处理的?
- c语音 udp最大长度_c语言udp自定义头文件 网络通信程序
- FLASH脚本语言详解
- Head First summary
- 【Python CheckiO 题解】Flatten a List
- 漫谈LiteOS-LiteOS SDK支持RISC-V架构
- Android 系统(138 )---Mtk平台 Android 打包解包*.img ,修改system.img 参数
- python 开发工具_「干货」推荐一整套 Python 开发工具
- ASA下邮件发送经常失败
- 判断页面环境是否在小程序的webview中
- VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
- ABB 机器人DH参数
- java实现进制转换
- linux传输系统架构,Linux后端程序成长关键技术——底层体系结构
- 英语3500词(17/20)science主题(2022.3.13)
- html鼠标滚轮监听,javascript监听鼠标滚轮事件浅析
- 毕业设计 基于单片机的交通安全车辆测速系统 - 嵌入式 物联网
- 十大优质外盘炒黄金平台排名
热门文章
- [笛卡儿积]业务中的复选框条件--输出所有的情况结果
- 你不知道的SQL语言数据库原理
- 【JavaScript】笑话生成器
- OpenCL与OpenACC的安装
- 7-2 列出连通集 (25分)
- python 中文乱码 \u5b66\u90a6\u5ba2\u6237
- 先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了
- 期末复习【计算机组成原理】
- 6、Spring Boot:自定义Servlet Filters
- Easypack: Ansible方式部署工具中升级Dashboard至2.0.0版