找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32730|回复: 7

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

[复制链接]
发表于 2019-9-30 14:25:43 | 显示全部楼层 |阅读模式
本帖最后由 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

以上,本人查了不少资料,奈何本人水平有限,特来请教大神该怎么写,先谢过~
发表于 2019-10-3 08:26:42 | 显示全部楼层
先试试以下哪个代码能找到 set-client-env.bat 这个文件:
http://bbs.bathome.net/thread-3465-1-1.html
发表于 2019-10-4 18:54:02 | 显示全部楼层
  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:32 | 显示全部楼层
这个文件起啥作用?数据库地址?意思你们单位不止一个金蝶服务器?
 楼主| 发表于 2019-10-7 22:53:10 | 显示全部楼层
先试试以下哪个代码能找到 set-client-env.bat 这个文件:
Batcher 发表于 2019-10-3 08:26

非常感谢您提供的教程帖,我会专门参照教程学习一下的,谢谢
 楼主| 发表于 2019-10-7 23:00:25 | 显示全部楼层
terse 发表于 2019-10-4 18:54



        谢谢详细的回复,我测试了一下,这个脚本实现了查找包含特定内容的指定文件。
但是实际替换的是EAS_HOME后面的路径这个参数,而不是替换文件中的特定IP或域名为a.erp.com。
不过这段代码也给我提供了一个很好的参考和帮助,我再仔细研究一下,非常感谢您。
 楼主| 发表于 2019-10-7 23:01:37 | 显示全部楼层
这个文件起啥作用?数据库地址?意思你们单位不止一个金蝶服务器?
窄口牛 发表于 2019-10-4 19:13



    是的,金蝶的EAS服务器地址,我们内部有非常多的测试环境。
发表于 2019-10-9 09:16:44 | 显示全部楼层
修改了一下  其他你可以按需求自己修改
  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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 11:26 , Processed in 0.019082 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表