作者:朱金灿

来源:http://blog.csdn.net/clever101

很多时候升级了第三方库,需要对很多工程修改设置。在VS中按住Ctrl键确实可以多选工程,但通过这样做也有麻烦的地方:一是需要将所有的工程都加到一个解决方案下,二是假如有多个版本如Debug、Release、UnicodeDebug和UnicodeRelease,操作起来也挺繁琐的。现在我恰好也有这样的需求,我将gdal库从1.9.1升级到1.10.0,我决定编写一个JScript脚本实现修改VC工程设置。具体就是在包含的头文件目录中我要将gdal_1_9_1_vc9/include替换为gdal_1_10_vc9/include,第三方库路径gdal_1_9_1_vc9/lib替换为gdal_1_10_vc9/lib,附加依赖库gdal19_i.lib替换为gdal110_i.lib,gdal19_i_D.lib替换为gdal110_i_D.lib。

VC工程文件实际上是一个xml文件,其包含头文件路径属性、第三方库路径属性以及附加依赖库都在Tool支项下设置。因此只需要读取VC工程文件,修改对应的属性就行。JScript脚本代码如下:

try
{
var WSShell = WScript.CreateObject("WScript.Shell");
var num = WScript.ScriptFullName.lastIndexOf("\\");
// 获取当前路径
var strCurPath = WScript.ScriptFullName.substr(0,num);
var FileSys = WScript.CreateObject("Scripting.FileSystemObject");
// 判断当前文件夹是否存在
if (FileSys.FolderExists(strCurPath))
{
// 修改当前文件夹下的Plugin子文件夹下的所有vc工程
var strPluginFolder = strCurPath + "\\Plugin";
var PluginFolder = FileSys.GetFolder(strPluginFolder);
// 获取所有子文件夹,遍历所有的子文件夹,修改所有的工程文件
var PlugSet = new Enumerator(PluginFolder.SubFolders);
for (var i = 0 ; !PlugSet.atEnd(); PlugSet.moveNext(),i++)
{
var strProjectFolder = strPluginFolder + "\\";
strProjectFolder = strProjectFolder + PlugSet.item().Name;
var ProjectFolder = FileSys.GetFolder(strProjectFolder);
// 获取所有的文件
var fenum = new Enumerator(ProjectFolder.Files);
for (var j = 0 ; !fenum.atEnd(); fenum.moveNext(),j++)
{
var strPrjFileName = fenum.item().Name;
var strSuff = FileSys.GetExtensionName(strPrjFileName);
// 假如文件是vc工程文件,就修改工程属性设置
if((strSuff=="vcproj"))
{
strProjectFolder = strProjectFolder + "\\";
strPrjFileName = strProjectFolder + strPrjFileName;
ChangePrjSetting(strPrjFileName);
}
}
}
}
}
catch(e)
{
WScript.Echo(e.description);
}
WScript.Echo("修改成功!"); // 修改工程文件,strPrjPath为工程文件路径
function ChangePrjSetting(strPrjPath)
{
try
{
var xmlDoc = null;
var signatures = [
"Msxml2.DOMDocument.6.0",
"Msxml2.DOMDocument.5.0",
"Msxml2.DOMDocument.4.0",
"Msxml2.DOMDocument.3.0",
"Msxml2.DOMDocument",
"Microsoft.XmlDom"];
for (var index = 0; index < signatures.length; index++)
{
try {
xmlDoc = new ActiveXObject(signatures[index]);
}
catch (e)
{
WScript.Echo(e.description);
}
}
xmlDoc.async = false;
xmlDoc.resolveExternals = false;
var strXmlPath = strPrjPath;
xmlDoc.load(strXmlPath);
if (xmlDoc.parseError.errorCode != 0)
{
var myError = xmlDoc.parseError;
WScript.Echo("打开xml文件失败: " + myError);
}
else
{
// 运用正则表达式进行匹配
var strPattern = /gdal_1_9_1_vc9/; // 定义一个匹配模板
// 修改包含头文件路径
ChangePrjAttribute(strXmlPath,xmlDoc,"AdditionalIncludeDirectories","include",strPattern);
// 修改第三方库路径
ChangePrjAttribute(strXmlPath,xmlDoc,"AdditionalLibraryDirectories","lib",strPattern);
// 修改release版的附加依赖库
strPattern = /gdal19_i.lib/;
ChangePrjDependenLib(strXmlPath,xmlDoc,"gdal19_i.lib","gdal110_i.lib",strPattern)
// 修改debug版的附加依赖库
strPattern = /gdal19_i_D.lib/;
ChangePrjDependenLib(strXmlPath,xmlDoc,"gdal19_i_D.lib","gdal110_i_D.lib",strPattern)
}
}
catch(e)
{
WScript.Echo(e.description);
}
} // 修改工程属性
function ChangePrjAttribute(strXmlPath,xmlDoc,strAttribute,strSuffix,strPattern)
{
var BinGroup = xmlDoc.getElementsByTagName("Tool");
for (var i = 0; i < BinGroup.length; i++)
{
var strIncDir = BinGroup.item(i).getAttribute(strAttribute);
if(null!=strIncDir)
{
var vecIncPath = new Array();
vecIncPath = strIncDir.split(";");
var bChange = false;
for(var j=0;j<vecIncPath.length;j++)
{
var result = strPattern.exec(vecIncPath[j]);
if(null!=result)
{
// 设置新的文件路径
vecIncPath[j] = "$(THIRD_PARTY)\\gdal_1_10_vc9\\"+strSuffix;
bChange = true;
}
}
if(true==bChange)
{
// 将所有的路径拼起来,注意使用一个冒号分开
var NewIncPath = vecIncPath[0];
for(var k=1;k<vecIncPath.length;k++)
{
NewIncPath = NewIncPath + ";"
NewIncPath = NewIncPath + vecIncPath[k];
}
BinGroup.item(i).setAttribute(strAttribute,NewIncPath);
xmlDoc.save(strXmlPath);
}
}
}
} // 修改附加依赖库
function ChangePrjDependenLib(strXmlPath,xmlDoc,strOldLib,strNewLib,strPattern)
{
var BinGroup = xmlDoc.getElementsByTagName("Tool");
for (var i = 0; i < BinGroup.length; i++)
{
var strDepLib = BinGroup.item(i).getAttribute("AdditionalDependencies");
if(null!=strDepLib)
{
var vecLibPath = new Array();
vecDepLib = strDepLib.split(" ");
var bChange = false;
for(var j=0;j<vecDepLib.length;j++)
{
var result = strPattern.exec(vecDepLib[j]);
if(null!=result)
{
// 修改依赖库名
vecDepLib[j] = strNewLib;
bChange = true;
}
}
if(true==bChange)
{
// 将所有的依赖库拼起来,注意使用一个空格分开
var NewDepLib = vecDepLib[0];
for(var k=1;k<vecDepLib.length;k++)
{
NewDepLib = NewDepLib + " ";
NewDepLib = NewDepLib + vecDepLib[k];
}
BinGroup.item(i).setAttribute("AdditionalDependencies",NewDepLib);
xmlDoc.save(strXmlPath);
}
}
}
}

使用JScript脚本批量修改VC工程设置的更多相关文章

  1. 用shell脚本批量修改文件后缀名

    早上本想将一些照片上传到相册中,但是由于所有照片的扩展名都是JPG而不是小写的jpg,因此造成了“格式不正确”而不能上传照片.此刻就产生了这样一个问题:使用shell脚本如何批量将所有文件的扩展名JP ...

  2. Python脚本批量修改服务器密码

    搭建环境 centos 7.4 使用脚本 python 批量修改connect用户的密码 生成密码为随机密码 保存为xls文档   passwd_chang #!/usr/bin/env python ...

  3. Shell脚本批量修改图片尺寸

    #!/bin/sh function scandir(){ local cur_dir parent_dir workdir workdir=$ cd ${workdir} if [ ${workdi ...

  4. shell 脚本 批量修改文件名

    修改文件名前 #!/bin/bask # for a in $( ls /etc/yum.repos.d/CentOS* );do if [ $a != '/etc/yum.repos.d/CentO ...

  5. linux shell脚本批量修改密码,无需交互输入

    转至:https://blog.csdn.net/weixin_34409357/article/details/89833777?utm_medium=distribute.pc_relevant. ...

  6. 批量修改Linux密码脚本(Python)

    搭建环境 centos 7.4 使用脚本 python 批量修改connect用户的密码 生成密码为随机密码 保存为xls文档 #!/usr/bin/env python # -*- coding: ...

  7. MYSQL批量修改表前缀与表名sql语句

    修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', ta ...

  8. 批量修改mysql的表前缀

    如何批量修改mysql的表前缀名称教程中将涉及两种方法修改,一种是批量修改(使用php脚步完成)一种是精确修改(使用sql查询语句完成). 方法一:使用sql语句修改mysql数据库表前缀名 首先我们 ...

  9. [转载][记录]shell 批量修改文件名

    参考了:[新手入门] shell脚本批量修改文件名 4楼回复 我刚好是在vagrant+ubuntu中进行开发,windows手动修改太麻烦. #!/bin/ksh ls *.htm | while ...

随机推荐

  1. Android开发系列(二十):AutoCompleteTextView(自己主动完毕文本框)的功能和使用方法

    当用户输入一定的字符之后,自己主动完毕文本框可以显示一个下拉菜单,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView可以依照用户的选择自己主动填写该文本框 AutoCo ...

  2. python3中numpy函数的argsort()

    摘自:https://www.cnblogs.com/yushuo1990/p/5880041.html argsort函数argsort函数返回的是数组值从小到大的索引值 Examples----- ...

  3. 【转载】zookeeper数据模型

    [转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ] ZooKeeper的数据结构, 与普通的文件系统极为类似. 见下图: 图片引用自developerworks 图中的每个节点称为一个 ...

  4. 对象模型图(OMD)阅读指南

    樱木 原文 对象模型图(OMD)阅读指南(转载) 补充几个名词概念: UML:Unified Modeling Language 统一建模语言,是用来对软件密集系统进行可视化建模的一种语言.UML为面 ...

  5. js进阶 12-3 如何实现元素跟随鼠标移动

    js进阶 12-3 如何实现元素跟随鼠标移动 一.总结 一句话总结:获取鼠标位置,将鼠标位置设置为元素偏移即可. 1.用什么事件获取鼠标位置? 用mousemove可以获取鼠标移动的时候的位置 $(d ...

  6. ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了

    前言 平时喜欢写东西,看博客,一直对编码有些懵,今天下午也不知道看到了什么,突然想了解下,就找到了这个文章,看完真的豁然开朗,这个必须留下来做纪念. 点击打开链接 1.ASCII 我们知道,计算机内部 ...

  7. href="javascript:;" href="javascript:void(0);" href="#"区别

    一.href="javascript:;" 这种用法不正确,这么用的话会出现浏览器访问"javascript:;"这个地址的现象: 二.href="j ...

  8. 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

    [107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a ...

  9. android studio 2.2 使用cmake编译NDK

    Android studio 2.2 已经进入beta版本,新功能添加众多,NDK编程也得到了简化.官方博客介绍.本文介绍如何使用新版android studio调用 c++代码,为了超级通俗易懂,例 ...

  10. lower_case_table_names(大小写敏感)

    1 简介    在MySQL中,数据库对应数据目录中的目录.数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎).因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小 ...