Board logo

标题: [文本处理] 搜索特定名称文件,如果该文件含有特定值则输出所在目录,并替换该值 [打印本页]

作者: g006    时间: 2019-9-30 14:25     标题: 搜索特定名称文件,如果该文件含有特定值则输出所在目录,并替换该值

本帖最后由 g006 于 2019-9-30 14:27 编辑

新人近期在研究bat,想做一个脚本实现如下功能:

已知在电脑上的多个位置存都在文件名称为set-client-env.bat
文件内容大概如下:
SET EAS_HOME=C:\Kingdee\eas
SET JAVA_HOME=C:\Kingdee\eas\clientjdk
SET UPDATE_SERVER=192.168.10.10:6888
SET EAS_SERVER=tcp://192.168.10.10:11034
SET JVM_INITIAL_HEAPSIZE=64
SET JVM_MAX_HEAPSIZE=512
SET ONDEMAND_UPDATE=false
SET ISSTART_LOADER=false
SET ISMULTI_LOADER=false
SET ENABLE_CDN=false
SET preheatClient=false

如上所示,现需实现的功能如下:
1.在电脑所有盘符内查找并获取所有文件名为set-client-env.bat的文件里的【SET EAS_HOME=】后面的完整路径及【SET UPDATE_SERVER=】后面的IP或域名地址,【:6888】这部分不需要。
2.如果该文件里有【192.168.10.10】或者【test.eas.com】这个参数,则自动把【192.168.10.10】或者【test.eas.com】替换为【a.erp.com】,并返回该文件中【SET EAS_HOME=】后面的路径,把该路径设置为变量EAS_HOME

以上,本人查了不少资料,奈何本人水平有限,特来请教大神该怎么写,先谢过~
作者: Batcher    时间: 2019-10-3 08:26

先试试以下哪个代码能找到 set-client-env.bat 这个文件:
http://bbs.bathome.net/thread-3465-1-1.html
作者: terse    时间: 2019-10-4 18:54

  1. @set @n=0 /* & @echo off
  2. set "file=set-client-env.bat"
  3. echo;    正在搜索...
  4. (for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  5.       if exist %%a:\nul (
  6.          for /f "tokens=*" %%b in ('dir /b /s /a-d %%a:\set-client-env.bat 2^>nul') do echo;%%b
  7. )))>tmp.t
  8. cscript.exe -nologo -e:jscript "%~0" <tmp.t "SET EAS_HOME=" "SET UPDATE_SERVER=" "a.erp.com"
  9. del tmp.t
  10. pause & exit /b
  11. */
  12. var fso =new ActiveXObject('Scripting.FileSystemObject');
  13. var re1 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(0) + ")(.+)","im");
  14. var re2 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(1) + ")((\\d+\\.){3}\\d+)","im");
  15. var re3 =/(192\.168\.10\.10|test\.eas\.com)(?=[:\s])/im;
  16. var r = WSH.Arguments(2);
  17. while (!WScript.StdIn.AtEndOfStream){
  18.     var  f = WScript.StdIn.ReadLine();
  19.     WScript.Echo('\n' + f + '\n');
  20.     var  str = fso.OpenTextFile(f, 1).ReadAll();
  21.     var s1 = str.match(re1);
  22.     var s2 = str.match(re2);
  23.     var s3 = str.match(re3);
  24.     if (re3.test(str)) {str =  str.replace(re1, "$1" + r)};
  25.     WScript.Echo(str);
  26.     // fso.OpenTextFile(f, 2, true).Write(str);
  27. }
复制代码

作者: 窄口牛    时间: 2019-10-4 19:13

这个文件起啥作用?数据库地址?意思你们单位不止一个金蝶服务器?
作者: g006    时间: 2019-10-7 22:53

先试试以下哪个代码能找到 set-client-env.bat 这个文件:
Batcher 发表于 2019-10-3 08:26

非常感谢您提供的教程帖,我会专门参照教程学习一下的,谢谢
作者: g006    时间: 2019-10-7 23:00

terse 发表于 2019-10-4 18:54



        谢谢详细的回复,我测试了一下,这个脚本实现了查找包含特定内容的指定文件。
但是实际替换的是EAS_HOME后面的路径这个参数,而不是替换文件中的特定IP或域名为a.erp.com。
不过这段代码也给我提供了一个很好的参考和帮助,我再仔细研究一下,非常感谢您。
作者: g006    时间: 2019-10-7 23:01

这个文件起啥作用?数据库地址?意思你们单位不止一个金蝶服务器?
窄口牛 发表于 2019-10-4 19:13



    是的,金蝶的EAS服务器地址,我们内部有非常多的测试环境。
作者: terse    时间: 2019-10-9 09:16

修改了一下  其他你可以按需求自己修改
  1. @set @n=0 /* & @echo off
  2. set "file=set-client-env.bat"
  3. echo;    正在搜索...
  4. (for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  5.       if exist %%a:\nul (
  6.          for /f "tokens=*" %%b in ('dir /b /s /a-d %%a:\set-client-env.bat 2^>nul') do echo;%%b
  7. )))>tmp.t
  8. cscript.exe -nologo -e:jscript "%~0" <tmp.t "SET EAS_HOME=" "SET UPDATE_SERVER=" "a.erp.com"
  9. del tmp.t
  10. pause & exit /b
  11. */
  12. var fso =new ActiveXObject('Scripting.FileSystemObject');
  13. var re1 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(0) + ")(.+)","im");
  14. var re2 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(1) + ")((\\d+\\.){3}\\d+)","im");
  15. var re3 =/(192\.168\.10\.10|test\.eas\.com)(?=[:\s])/igm;
  16. var r = WSH.Arguments(2);
  17. while (!WScript.StdIn.AtEndOfStream){
  18.     var  f = WScript.StdIn.ReadLine();
  19.     var  str = fso.OpenTextFile(f, 1).ReadAll();
  20.     var s1 = str.match(re1);
  21.     var s2 = str.match(re2);
  22.     var s3 = str.match(re3);
  23.     WScript.Echo("\n" + f+"\n");
  24.     if (s1) { WScript.Echo(s1[0]) };
  25.     if (s2) { WScript.Echo(s2[0]) };
  26.     if (s3) {
  27.         WScript.Echo(s1[2] + "\n");
  28.         str =  str.replace(re3, r)
  29.     }
  30.    
  31.     WScript.Echo(str);
  32.     // fso.OpenTextFile(f, 2, true).Write(str);
  33. }
复制代码
回复 6# g006




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2