作者:朱金灿
来源: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工程文件相关推荐

  1. Python脚本-批量修改文件名

    Notice1:os.listdir(path) filenames = os.listdir(path) os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以 ...

  2. 使用python脚本批量修改Arcgis的数据字段类型或者名称

    参考其他的文章,放上代码,直接使用arcgis自带的python IDE运行,可解决中文字符的问题. # -- coding: utf-8 -- import arcpy import sys fro ...

  3. python脚本批量修改图片像素大小和重命名

    可能对学习FCN和CNN的同学有点帮助 Resize程序 def resize(f):rgb=io.imread(f) #依次读取rgb图片#gray=color.rgb2gray(rgb) #将rg ...

  4. python数据库操作批量sql执行_利用Python如何批量修改数据库执行Sql文件

    利用Python如何批量修改数据库执行Sql文件 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  利用Python如何批量修改数据库执行Sql文件.txt ] (友 ...

  5. Python自动批量修改文件名称的方法大全

    前言 本文介绍基于Python语言,按照一定命名规则批量修改多个文件的文件名的方法.已知现有一个文件夹,其中包括班级所有同学上交的作业文件,每人一份:所有作业文件命名格式统一,都是地信1701_姓名_ ...

  6. python docx 批量修改docx文件内容和选择位置添加内容

    #-*- encoding:utf_8 -*- from docx import Document from docx.shared import Inches from log import log ...

  7. Python OpenCV 批量修改文件夹内所有图片的尺寸

    Python OpenCV 批量修改文件夹内所有图片的尺寸 简述 插件 遍历所有文件(包括子文件) 缩放图片尺寸并保存图片 遍历并修改图片 简述 遍历文件夹下的所有子文件(包括自文件夹内的)的图片批量 ...

  8. iOS使用shell脚本批量修改属性

    背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,除了我在上一篇文章中说道的在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝.还有另一种 ...

  9. Python脚本批量重命名图片

    Python脚本批量重命名图片 # -*- coding: utf-8 -*- """ Created on Tue Mar 23 13:34:59 2021@autho ...

最新文章

  1. Apache Tomcat 7.x 概述
  2. CCF C³:创业公司如何面对开源?知乎CTO李大海:谢邀
  3. Kafka如果丢了消息,怎么处理的?
  4. c语音 udp最大长度_c语言udp自定义头文件 网络通信程序
  5. FLASH脚本语言详解
  6. Head First summary
  7. 【Python CheckiO 题解】Flatten a List
  8. 漫谈LiteOS-LiteOS SDK支持RISC-V架构
  9. Android 系统(138 )---Mtk平台 Android 打包解包*.img ,修改system.img 参数
  10. python 开发工具_「干货」推荐一整套 Python 开发工具
  11. ASA下邮件发送经常失败
  12. 判断页面环境是否在小程序的webview中
  13. VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
  14. ABB 机器人DH参数
  15. java实现进制转换
  16. linux传输系统架构,Linux后端程序成长关键技术——底层体系结构
  17. 英语3500词(17/20)science主题(2022.3.13)
  18. html鼠标滚轮监听,javascript监听鼠标滚轮事件浅析
  19. 毕业设计 基于单片机的交通安全车辆测速系统 - 嵌入式 物联网
  20. 十大优质外盘炒黄金平台排名

热门文章

  1. [笛卡儿积]业务中的复选框条件--输出所有的情况结果
  2. 你不知道的SQL语言数据库原理
  3. 【JavaScript】笑话生成器
  4. OpenCL与OpenACC的安装
  5. 7-2 列出连通集 (25分)
  6. python 中文乱码 \u5b66\u90a6\u5ba2\u6237
  7. 先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了
  8. 期末复习【计算机组成原理】
  9. 6、Spring Boot:自定义Servlet Filters
  10. Easypack: Ansible方式部署工具中升级Dashboard至2.0.0版