日期:2014-05-16 浏览次数:20430 次
作者:朱金灿
来源: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","inc