Board logo

标题: [文本处理] 【已处理】批处理怎样修改文本内部路径? [打印本页]

作者: HerveyHu    时间: 2020-11-22 16:03     标题: 【已处理】批处理怎样修改文本内部路径?

本帖最后由 HerveyHu 于 2020-11-25 09:52 编辑

是这样的,有个文档需要经常配置路径地址,索性写了个bat,要实现的的目的如下,麻烦大佬帮忙想想办法,感谢!:

要修改文件中所有 IceBox\ (IceBox是文件夹)之前的路径,比如 G:\111\IceBox\IceBox_wf.dll,(G:\111\)随便变成什么地址,(IceBox\*)这个和后面的内容不变,所以本人尝试写了代码,不能完全解决问题, 路径只会会无限添加成比如G:\333\222\111\IceBox\IceBox_wf.dll,请问有没有好的解决方法,谢谢!


要修改的文件内容:
java_app_class  net.icefai.Main.IceBox
java_app_classpath G:\111\IceBox\IceBox_wf.dll
java_app_start  iceStart
java_app_stop   iceStop
allow_stop      true
delay_start     false
text_dir        G:\111\IceBox\text



bat 修改路径代码如下:
  1. REM 获取bat上级路径
  2. set "bd=%cd%"
  3. cd..
  4. set "bbd=%cd%"
  5. cd %bd%
  6. set Newdisk=%bbd%
  7. REM 读取旧盘符
  8. for /f "tokens=1 delims=\" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
  9. for /f "tokens=2 delims= " %%j in ("%%i") do (
  10. set OldDisk=%%j
  11. )
  12. )
  13. REM 读取IceBox_*.dat所有内容
  14. for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
  15. REM 设置变量str为每行内容
  16. set str=%%l
  17. REM 如果该行有旧盘符a,则将其改为新盘符A
  18. set "str=!str:%Olddisk%\=%Newdisk%\!"
  19. REM 把修改后的全部行存入$
  20. echo !str!>>$
  21. )
  22. REM 替换原文件
  23. move $ %strIceBoxFilePath%
  24. echo 设置完成!
复制代码

作者: flashercs    时间: 2020-11-22 18:24

  1. @echo off
  2. REM 获取bat上级路径
  3. set "bd=%cd%"
  4. cd..
  5. set "bbd=%cd%"
  6. cd %bd%
  7. set Newdisk=%bbd%
  8. set strIceBoxFilePath=d:\sec\icebox\icebox.txt
  9. REM 读取旧盘符
  10. set Olddisk=
  11. for /f "tokens=1*" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
  12.   set Olddisk=%%j
  13. )
  14. if not defined Olddisk exit /b
  15. set "prefix=%Olddisk%\."
  16. @REM echo prefix_before=%prefix%
  17. :loop3
  18. for %%A in ("%prefix%") do (
  19.   set "prefix=%%~dpA."
  20.   if /i not "%%~nxA"=="IceBox" if not "%%~pA"=="\" (
  21.     goto loop3
  22.   )
  23. )
  24. set "prefix=%prefix:~,-1%"
  25. @REM echo prefix_after=%prefix%
  26. REM 读取IceBox_*.dat所有内容
  27. for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
  28. REM 设置变量str为每行内容
  29. setlocal EnableDelayedExpansion
  30. set str=%%l
  31. REM 如果该行有旧盘符a,则将其改为新盘符A
  32. set "str=!str:%prefix%=%Newdisk%\!"
  33. REM 把修改后的全部行存入$
  34. echo !str!>>$
  35. endlocal
  36. )
  37. REM 替换原文件
  38. move $ %strIceBoxFilePath%
  39. echo 设置完成!
复制代码

作者: HerveyHu    时间: 2020-11-23 15:06

本帖最后由 HerveyHu 于 2020-11-23 15:12 编辑

回复 2# flashercs
抱歉回复晚了,试了您帮忙修改的代码,成功执行了,另外再请教您一个问题

比如想把 proetkdat G:\111\IceBox\IceBox_wf.dat 这段内容 加入到1.pro文件中,但是怕已经存在,所以需要先查阅一下1.pro,如果存在相同G:\111路径则退出执行,不相同则修改成最新的如G:\111\222\IceBox\IceBox_wf.dat,如不存在则在最后一行添加进去。

再次麻烦,感激不尽!
作者: HerveyHu    时间: 2020-11-23 16:44     标题: RE: 批处理怎样修改文本内部路径?

回复 4# flashercs

代码已经可以了,感谢帮忙!
作者: HerveyHu    时间: 2020-11-23 18:16

本帖最后由 HerveyHu 于 2020-11-23 18:58 编辑

回复 4# flashercs


大佬问一下,findstr /ric:"creotkdat  *.*\\IceBox\\IceBox_c4.dat" %strConfigFilePath%||>>%strConfigFilePath% echo creotkdat %Newdisk%\IceBox\IceBox_c4.dat
这段新添加的内容能让它在文本中另起一行吗?目前是接在前面内容后面的

另外发现一个bug,如果文本中有了这段路径,外面的文件变更地址后,重新运行bat,这段地址会被检测到,但不会被新地址取代,麻烦帮忙修改一下!
作者: flashercs    时间: 2020-11-24 15:20

  1. findstr /ric:"creotkdat  *.*\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
  2. if %errorlevel% equ 1 >>%strConfigFilePath% echo creotkdat %Newdisk%\IceBox\IceBox_c4.dat
复制代码
回复 6# HerveyHu
作者: HerveyHu    时间: 2020-11-24 17:11

回复 7# flashercs

您好,试了您修改的代码,发现不成功,可能是我没表述好,想实现的结果是这样的,先检测文本中有没有creotkdat  *.*\\IceBox\\IceBox_c4.dat,如果有,则比对路径*.*和%Newdisk%,如果相同,则结束此条代码,如果不相同,就把*.*替换成%Newdisk%,如果不存在此creotkdat  *.*\\IceBox\\IceBox_c4.dat,则添加creotkdat %Newdisk%\IceBox\IceBox_%%a.dat

再次麻烦,不好意思,万分感谢!
作者: HerveyHu    时间: 2020-11-25 00:21

本帖最后由 HerveyHu 于 2020-11-25 00:27 编辑

回复 9# flashercs

感谢您及时的恢复,代码测试了一下,可以满足需求,但是有个瑕疵,因为指定的路径有可能在别的内容后面或前面,或前后都有内容,并不一定单独在一行,如Command `ProCmdNamedViewsGalSelect`  `TOP`;creotkdat G:\111\*\creotkdat....,在运行findstr /vric 的时候会把整行删除,本人有尝试在此代码之前增加一个换行的动作,使它与前后代码分隔开,单独形成一行,然后再删除,但是没有成功,麻烦修正,或者烦请提供更简单的方法,谢谢!

set Lf=^


for /f %%a in ('copy /z %0 nul') do set "Cr=%%a"
for %%z in ("!Cr!!Lf!") do (
   endlocal
   for /f "delims=" %%a in ('findstr "IceBox\\" "%strConfigFilePath%"') do (
      set "str=%%a"
      echo; !str:creotkdat=%%~zcreotkdat!
   )
)>$
作者: flashercs    时间: 2020-11-25 07:46

  1. @echo off
  2. REM 获取bat上级路径
  3. set "bd=%cd%"
  4. cd..
  5. set "bbd=%cd%"
  6. cd %bd%
  7. set Newdisk=%bbd%
  8. set strIceBoxFilePath=d:\sec\icebox\icebox.txt
  9. REM 读取旧盘符
  10. set Olddisk=
  11. for /f "tokens=1*" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
  12.   set Olddisk=%%j
  13. )
  14. if not defined Olddisk exit /b
  15. set "prefix=%Olddisk%\."
  16. @REM echo prefix_before=%prefix%
  17. :loop3
  18. for %%A in ("%prefix%") do (
  19.   set "prefix=%%~dpA."
  20.   if /i not "%%~nxA"=="IceBox" if not "%%~pA"=="\" (
  21.     goto loop3
  22.   )
  23. )
  24. set "prefix=%prefix:~,-1%"
  25. @REM echo prefix_after=%prefix%
  26. REM 读取IceBox_*.dat所有内容
  27. for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
  28. REM 设置变量str为每行内容
  29. setlocal EnableDelayedExpansion
  30. set str=%%l
  31. REM 如果该行有旧盘符a,则将其改为新盘符A
  32. set "str=!str:%prefix%=%Newdisk%\!"
  33. REM 把修改后的全部行存入$
  34. echo !str!>>$
  35. endlocal
  36. )
  37. REM 替换原文件
  38. move $ %strIceBoxFilePath%
  39. set strConfigFilePath=d:\sec\icebox\icebox.txt
  40. findstr /ric:"creotkdat  *.*\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
  41. if %errorlevel% equ 1 (
  42.   REM 未找到
  43.   >>%strConfigFilePath% echo creotkdat %Newdisk%\IceBox\IceBox_c4.dat
  44.   goto end
  45. )
  46. set reNewdisk=%Newdisk:\=\\%
  47. set reNewdisk=%reNewdisk:\.=\.%
  48. REM 找到
  49. findstr /ric:"creotkdat  *%reNewdisk%\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
  50. REM 不匹配%Newdisk%
  51. if %errorlevel% equ 1 powershell -NoProfile -Command "(Get-Content -LiteralPath \"%strConfigFilePath%\" -ReadCount 0) -replace \"(creotkdat\s+).*?(?=\\IceBox\\IceBox_c4.dat)\", \"`${1}%Newdisk%\" | Set-Content -LiteralPath \"%strConfigFilePath%\""
  52. :end
  53. echo 设置完成!
复制代码

作者: HerveyHu    时间: 2020-11-25 09:51

回复 9# flashercs

感谢一早回复,已经可以正常运行,受益良多,感谢帮忙,辛苦!
作者: HerveyHu    时间: 2020-11-25 15:30

回复 9# flashercs

请教一下,powershell可以输出UTF-8吗?现在输出是ANSI,有时中文会乱码,谢谢!
作者: flashercs    时间: 2020-11-25 15:42

回复 11# HerveyHu


    可以,你批处理脚本能读取utf8吗?
你把批处理脚本保存为utf8-nobom编码,同时最上边修改成这样:
  1. @echo off
  2. chcp 65001
  3. REM 获取bat上级路径
复制代码

作者: HerveyHu    时间: 2020-11-25 15:50

本帖最后由 HerveyHu 于 2020-11-25 15:51 编辑

回复 12# flashercs

UTF-8的可以读取,目前读取的格式就是这个,这个我在开头有加,文本现在改了,整体代码如下,请帮忙看看,还有没有问题,本人不是IT行业的,所以会的不多,感谢指导!
  1. @
  2. echo off & setlocal enabledelayedexpansion
  3. REM 声明采用UTF-8编码
  4. chcp 65001
  5. cls
  6. REM 定义config.pro文件路径
  7. :loop1
  8. set /p input=请复制粘贴config.pro所在文件夹路径!:
  9. set strConfigFilePath=%input%\config.pro
  10. if not exist %strConfigFilePath% echo 没有找到 config.pro 文件,请重新复制路径!& goto loop1
  11. REM 获取bat上级路径
  12. set "bd=%cd%"
  13. cd..
  14. set "bbd=%cd%"
  15. cd %bd%
  16. set Newdisk=%bbd%
  17. REM 获取bat当前路径
  18. set bct=%~dp0
  19. REM 确认Proe/Creo版本
  20. :loop2
  21. echo.
  22. set Num=
  23. echo. 1   wildFire5.0
  24. echo. 2   Creo 2.0
  25. echo. 3   Creo 3.0
  26. echo. 4   Creo 4.0 +
  27. set /p Num=请输入对应软件前面的序号,按Enter确认:
  28. echo.
  29. set "Num=%Num:~,1%"
  30. if "%Num:"=""%" equ "1" goto ver
  31. if "%Num:"=""%" equ "2" goto ver
  32. if "%Num:"=""%" equ "3" goto ver
  33. if "%Num:"=""%" equ "4" goto ver
  34. echo 输入有误,请重新输入!!!
  35. goto loop2
  36. :ver
  37. REM 设置参数类型
  38. if %Num% GTR 1 (set Pathtype=creotkdat) else (set Pathtype=proetkdat)
  39. REM 提取版本号
  40. set b=wf c2 c3 c4
  41. for /f "tokens=%Num% delims= " %%a in ("%b%") do (set c=%%a)
  42. set strIceBoxFilePath=%bct%IceBox_%c%.dat
  43. findstr /ric:"%Pathtype%  *.*\\IceBox\\IceBox_%c%.dat" %strConfigFilePath%
  44. if %errorlevel% equ 1 (
  45. REM 未找到
  46. >>%strConfigFilePath% echo %Pathtype% %Newdisk%\IceBox\IceBox_%c%.dat
  47. goto next
  48. )
  49. REM 找到
  50. set reNewdisk=%Newdisk:\=\\%
  51. set reNewdisk=%reNewdisk:\.=\.%
  52. findstr /ric:"%Pathtype% *%reNewdisk%\\IceBox\\IceBox_%c%.dat" %strConfigFilePath%
  53. REM 不匹配%Newdisk%
  54. if %errorlevel% equ 1 powershell -NoProfile -Command "(Get-Content -LiteralPath \"%strConfigFilePath%\" -ReadCount 0) -replace \"(%Pathtype%\s+).*?(?=\\IceBox\\IceBox_%c%.dat)\", \"`${1}%Newdisk%\" | Set-Content -LiteralPath \"%strConfigFilePath%\""||del /f /s /q /a "%bct%$"
  55. :next
  56. REM IceBox_*.dat 更改路径
  57. REM 读取旧路径
  58. set Olddisk=
  59. for /f "tokens=1*" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
  60.   set Olddisk=%%j
  61. )
  62. set "prefix=%Olddisk%\."
  63. REM echo prefix_before=%prefix%
  64. :loop3
  65. for %%A in ("%prefix%") do (
  66.   set "prefix=%%~dpA."
  67.   if /i not "%%~nxA"=="IceBox" if not "%%~pA"=="\" (
  68.     goto loop3
  69.   )
  70. )
  71. set "prefix=%prefix:~,-1%"
  72. REM echo prefix_after=%prefix%
  73. REM 读取IceBox_*.dat所有内容
  74. for /f "tokens=*" %%k in (%strIceBoxFilePath%) do (
  75. REM 设置变量str为每行内容
  76. set str=%%k
  77. REM 如果该行有旧盘符路径a,则将其改为新盘符路径A
  78. set "str=!str:%prefix%=%Newdisk%\!"
  79. REM 把修改后的全部行存入$
  80. echo !str!>>$
  81. )
  82. REM 替换原文件
  83. move $ %strIceBoxFilePath%
  84. echo 设置完成!
  85. choice /t 1 /d y /n >nul
  86. exit
复制代码

作者: HerveyHu    时间: 2020-11-25 15:58

本帖最后由 HerveyHu 于 2020-11-25 15:59 编辑

回复 12# flashercs

刚刚试了改bat编码保存格式,发现被导入修改内容的文件编码被从UTF-8 改成了ANSI,请问可以修改吗?
作者: flashercs    时间: 2020-11-25 19:58

  1. if %errorlevel% equ 1 powershell -NoProfile -Command "(Get-Content -LiteralPath \"%strConfigFilePath%\" -ReadCount 0 -Encoding utf8) -replace \"(%Pathtype%\s+).*?(?=\\IceBox\\IceBox_%c%.dat)\", \"`${1}%Newdisk%\" | Set-Content -Encoding utf8 -LiteralPath \"%strConfigFilePath%\""||del /f /s /q /a "%bct%$"
复制代码
回复 14# HerveyHu
作者: HerveyHu    时间: 2020-11-25 20:16

回复 15# flashercs


应该是解决了,感谢!




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