标题: [文本处理] 搜索特定名称文件,如果该文件含有特定值则输出所在目录,并替换该值 [打印本页]
作者: 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
- @set @n=0 /* & @echo off
- set "file=set-client-env.bat"
- echo; 正在搜索...
- (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 (
- if exist %%a:\nul (
- for /f "tokens=*" %%b in ('dir /b /s /a-d %%a:\set-client-env.bat 2^>nul') do echo;%%b
- )))>tmp.t
- cscript.exe -nologo -e:jscript "%~0" <tmp.t "SET EAS_HOME=" "SET UPDATE_SERVER=" "a.erp.com"
- del tmp.t
- pause & exit /b
- */
- var fso =new ActiveXObject('Scripting.FileSystemObject');
- var re1 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(0) + ")(.+)","im");
- var re2 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(1) + ")((\\d+\\.){3}\\d+)","im");
- var re3 =/(192\.168\.10\.10|test\.eas\.com)(?=[:\s])/im;
- var r = WSH.Arguments(2);
- while (!WScript.StdIn.AtEndOfStream){
- var f = WScript.StdIn.ReadLine();
- WScript.Echo('\n' + f + '\n');
- var str = fso.OpenTextFile(f, 1).ReadAll();
- var s1 = str.match(re1);
- var s2 = str.match(re2);
- var s3 = str.match(re3);
- if (re3.test(str)) {str = str.replace(re1, "$1" + r)};
- WScript.Echo(str);
- // fso.OpenTextFile(f, 2, true).Write(str);
- }
复制代码
作者: 窄口牛 时间: 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
修改了一下 其他你可以按需求自己修改- @set @n=0 /* & @echo off
- set "file=set-client-env.bat"
- echo; 正在搜索...
- (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 (
- if exist %%a:\nul (
- for /f "tokens=*" %%b in ('dir /b /s /a-d %%a:\set-client-env.bat 2^>nul') do echo;%%b
- )))>tmp.t
- cscript.exe -nologo -e:jscript "%~0" <tmp.t "SET EAS_HOME=" "SET UPDATE_SERVER=" "a.erp.com"
- del tmp.t
- pause & exit /b
- */
- var fso =new ActiveXObject('Scripting.FileSystemObject');
- var re1 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(0) + ")(.+)","im");
- var re2 = new RegExp("((?:^|\\n)\\s*" + WSH.Arguments(1) + ")((\\d+\\.){3}\\d+)","im");
- var re3 =/(192\.168\.10\.10|test\.eas\.com)(?=[:\s])/igm;
- var r = WSH.Arguments(2);
- while (!WScript.StdIn.AtEndOfStream){
- var f = WScript.StdIn.ReadLine();
- var str = fso.OpenTextFile(f, 1).ReadAll();
- var s1 = str.match(re1);
- var s2 = str.match(re2);
- var s3 = str.match(re3);
- WScript.Echo("\n" + f+"\n");
- if (s1) { WScript.Echo(s1[0]) };
- if (s2) { WScript.Echo(s2[0]) };
- if (s3) {
- WScript.Echo(s1[2] + "\n");
- str = str.replace(re3, r)
- }
-
- WScript.Echo(str);
- // fso.OpenTextFile(f, 2, true).Write(str);
- }
复制代码
回复 6# g006
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |