Jscriptスクリプトを使用してVCエンジニアリング設定を一括変更


作者:朱金燦
ソース:http://blog.csdn.net/clever101
 
        サードパーティ製ライブラリをアップグレードする場合が多く、多くのプロジェクトに対して設定を変更する必要があります.VSでCtrlキーを押すと確かに複数のプロジェクトを選択できますが、これによって面倒な点もあります.1つは、すべてのプロジェクトを1つのソリューションに追加する必要があることです.2つは、Debug、Release、UnicodeDebug、UnicodeReleaseなどの複数のバージョンがあれば、操作も煩雑です.今私もちょうどこのような需要があって、私はgdalライブラリを1.9.1から1.10.0にアップグレードして、私はJscriptスクリプトを書いてVC工事の設定を修正することを決定しました.具体的には、含まれるヘッダファイルディレクトリにgdal_を1_9_1_vc 9/includeをgdalに置き換える1_10_vc 9/include、サードパーティライブラリパスgdal_1_9_1_vc 9/libをgdalに置き換える1_10_vc 9/lib、依存ライブラリgdal 19を追加i.libをgdal 110_に置き換えるi.lib,gdal19_i_D.libをgdal 110_に置き換える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);							
              }							
		 }
	}
}