Board logo

标题: [文本处理] [已解决]批处理怎样修改多个不同路径下同一文件名的配置文件文本? [打印本页]

作者: cuteai    时间: 2013-1-24 16:17     标题: [已解决]批处理怎样修改多个不同路径下同一文件名的配置文件文本?

需求是修改多个路径下的同一文件名的配置文件global.properties 将里面的192.168.8.103换成用户手动输入的IP

学着写了一点如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set a_dir=%~dp0\1
  4. set b_dir=%~dp0\2
  5. set c_dir=%~dp0\3
  6. set d_dir=%~dp0\4
  7. set replaced=192.168.8.103
  8. set all=
  9. set /p all=请输入替换的IP地址:
  10. for %%a in (%a_dir% %b_dir% %c_dir% %d_dir%) do (
  11. sed -i "s/%replaced%/%all%/g" "%%a\global.properties"
  12. )
  13. pause
复制代码
运行结果如下:
  1. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103/192.168.8.210/g" "and\glo
  2. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103/192.168.8.210/g" "Setting
  3. s\Administrator\??\?????\\1\global.properties" )
  4. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103/192.168.8.210/g" "C:\Docu
  5. ments\global.properties" )
  6. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103/192.168.8.210/g" "and\glo
  7. bal.properties" )
  8. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103/192.168.8.210/g" "Setting
  9. s\Administrator\??\?????\\2\global.properties" )
  10. C:\DOCUME~1\ADMINI~1\??\???~1>pause-i "s/192.168.8.103/192.168.8.210/g" "Setting
  11. Press any key to continue . . . al.properties" )
复制代码
功能没有实现,请指正哪些地方写错了
作者: BAT-VBS    时间: 2013-1-24 20:57

  1. @echo off
  2. set replaced=192.168.8.103
  3. set all=
  4. set /p all=请输入替换的IP地址:
  5. for /l %%a in (1,1,4) do (
  6.     sed -i "s/%replaced%/%all%/g" "%~dp0%%a\global.properties"
  7. )
复制代码

作者: cuteai    时间: 2013-1-25 09:38

回复 2# BAT-VBS


    感谢帮助,可能是我描述的不是很清楚,1-4的文件夹名只是用来打个比方,实际上global.properties文件所在路径并不是规律的,而且路径很长
所以当时我写的时候有set a_dir b_dir...... 就是这个考虑
作者: apang    时间: 2013-1-25 10:00

第10行
  1. for %%a in ("%a_dir%" "%b_dir%" "%c_dir%" "%d_dir%") do (
复制代码
第11行%%a改成%%~a
作者: cuteai    时间: 2013-1-25 11:11

回复 4# apang


    按照你的思路 我修改了一下,可以实现功能,非常感谢

贴出整段代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set a_dir=%~dp0\1\1\2
  4. set b_dir=%~dp0\2\1\2\3
  5. set c_dir=%~dp0\3\1
  6. set d_dir=%~dp0\4\1\2\3\4
  7. set replaced=192.168.8.103
  8. set all=
  9. set /p all=请输入替换的IP地址:
  10. for %%a in ("%a_dir%" "%b_dir%" "%c_dir%" "%d_dir%") do (
  11. sed -i "s/%replaced%/%all%/g" "%%~a\global.properties"
  12. )
  13. pause
复制代码

作者: cuteai    时间: 2013-1-25 17:03

我按照apang这位兄弟说的那样修改之后  以楼上那段代码来测试 可以实现功能了
现在我实际应用的时候
只修改了路径那块
  1. set a_dir=%~dp0\T8APP\GCM\resource
  2. set b_dir=%~dp0\T8APP\MCM\resource
  3. set c_dir=%~dp0\resin-pro-3.1.8\webapps\portal\WEB-INF\classes\com\trisun\portal\resources
  4. set d_dir=%~dp0\resin-pro-3.1.8\webapps\T81\WEB-INF\classes\com\trisun\T81\resources
  5. set e_dir=%~dp0\resin-pro-3.1.8\webapps\T82A\WEB-INF\classes\com\trisun\T82A\resources
复制代码
其他没有变动,结果就报错了。。。
  1. C:\Documents and Settings\Administrator\桌面\新建文件夹>(sed -i "s/192.168.8.103/192.168.8.210/g" "
  2. C:\Documents and Settings\Administrator\桌面\新建文件夹\\resin-pro-3.1.8\webapps\portal\WEB-INF\cla
  3. sses\com\trisun\portal\resources\global.properties" )
  4. 系统无法执行指定的程序。
复制代码
请问该如何解决
作者: apang    时间: 2013-1-25 17:38

回复 6# cuteai


所有的%~dp0\改成%~dp0
作者: cuteai    时间: 2013-1-25 17:48

回复 7# apang


    将%~dp0\改成%~dp0后 仍然显示 系统无法执行指定的程序。
我将路径用""括起来后 倒是没有报错了
显示如下:
  1. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" "and\gl
  2. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" "Settin
  3. gs\Administrator\??\?????\T8APP\GCM\resource""\global.properties" )
  4. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" ""C:\Do
  5. cuments\global.properties" )
  6. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" "and\gl
  7. obal.properties" )
  8. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" "Settin
  9. C:\DOCUME~1\ADMINI~1\??\???~1>(sed -i "s/192.168.8.103 /192.168.8.210/g" "Settin
  10. gs\Administrator\??\?????\resin-pro-3.1.8\webapps\T82A\WEB-INF\classes\com\trisu
  11. n\T82A\resources""\global.properties" ) " )
  12. ????????????
  13. C:\DOCUME~1\ADMINI~1\??\???~1>pause-i "s/192.168.8.103 /192.168.8.210/g" ""C:\Do
  14. Press any key to continue . . .
复制代码
但是文件并没有修改成功,里面的IP还是192.168.8.103
作者: BAT-VBS    时间: 2013-1-25 19:15

回复 8# cuteai


    sed版本是?
作者: apang    时间: 2013-1-25 19:37

本帖最后由 apang 于 2013-1-25 20:19 编辑

回复 8# cuteai


    Win7测试了下,确实有问题。
   sed4.21:http://www.bathome.net/thread-16975-1-1.html    不清楚是不是路径太深的原因。
   如果文件不是很多很大,下面的也可以的:
  1. @echo off
  2. set "f=global.properties"
  3. set "a_dir=%~dp0T8APP\GCM\resource"
  4. set "b_dir=%~dp0resin-pro-3.1.8\webapps\portal\WEB-INF\classes\com\trisun\portal\resources"
  5. set "c_dir=%~dp0resin-pro-3.1.8\webapps\T81\WEB-INF\classes\com\trisun\T81\resources"
  6. set "d_dir=%~dp0resin-pro-3.1.8\webapps\T82A\WEB-INF\classes\com\trisun\T82A\resources"
  7. set "replaced=192.168.8.103"
  8. set /p all=请输入替换的IP地址:
  9. for %%a in ("%a_dir%" "%b_dir%" "%c_dir%" "%d_dir%") do (
  10.   pushd "%%~a\"
  11.   (for /f "tokens=1* delims=:"eol^= %%b in ('findstr /n .* "%f%"') do (
  12.     set "str=%%c"
  13.     setlocal enabledelayedexpansion
  14.     if "!str!" neq "" set "str=!str:%replaced%=%all%!"
  15.     echo,!str!
  16.     endlocal
  17.   ))>$
  18.   move $ %f%
  19.   popd
  20. )
  21. pause
复制代码

作者: terse    时间: 2013-1-26 18:46

本帖最后由 terse 于 2013-1-26 19:07 编辑

win7 没建议   我 xp 来的
作者: cuteai    时间: 2013-1-28 08:08

回复 9# BAT-VBS


    论坛里下载的sed4.2.1单文件版
作者: cuteai    时间: 2013-1-28 08:47

回复 10# apang


    操作系统环境就是XP的
另您提供的这段代码可以实现功能了,非常感谢
不过就是有些没看懂 ,我再研究下,再次表示感谢!




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