标题: [文本处理] 【已处理】批处理怎样修改文本内部路径? [打印本页]
作者: 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 修改路径代码如下:- REM 获取bat上级路径
-
-
- set "bd=%cd%"
- cd..
- set "bbd=%cd%"
- cd %bd%
- set Newdisk=%bbd%
-
-
- REM 读取旧盘符
- for /f "tokens=1 delims=\" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
- for /f "tokens=2 delims= " %%j in ("%%i") do (
- set OldDisk=%%j
- )
- )
-
-
- REM 读取IceBox_*.dat所有内容
- for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
-
-
- REM 设置变量str为每行内容
- set str=%%l
-
-
- REM 如果该行有旧盘符a,则将其改为新盘符A
- set "str=!str:%Olddisk%\=%Newdisk%\!"
-
-
- REM 把修改后的全部行存入$
- echo !str!>>$
-
-
- )
-
-
- REM 替换原文件
-
-
- move $ %strIceBoxFilePath%
-
-
- echo 设置完成!
复制代码
作者: flashercs 时间: 2020-11-22 18:24
- @echo off
-
- REM 获取bat上级路径
-
-
- set "bd=%cd%"
- cd..
- set "bbd=%cd%"
- cd %bd%
- set Newdisk=%bbd%
-
- set strIceBoxFilePath=d:\sec\icebox\icebox.txt
- REM 读取旧盘符
- set Olddisk=
- for /f "tokens=1*" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
- set Olddisk=%%j
- )
- if not defined Olddisk exit /b
- set "prefix=%Olddisk%\."
- @REM echo prefix_before=%prefix%
- :loop3
- for %%A in ("%prefix%") do (
- set "prefix=%%~dpA."
- if /i not "%%~nxA"=="IceBox" if not "%%~pA"=="\" (
- goto loop3
- )
- )
- set "prefix=%prefix:~,-1%"
- @REM echo prefix_after=%prefix%
- REM 读取IceBox_*.dat所有内容
- for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
-
-
- REM 设置变量str为每行内容
-
- setlocal EnableDelayedExpansion
- set str=%%l
- REM 如果该行有旧盘符a,则将其改为新盘符A
- set "str=!str:%prefix%=%Newdisk%\!"
-
-
- REM 把修改后的全部行存入$
- echo !str!>>$
- endlocal
-
- )
-
-
- REM 替换原文件
-
-
- move $ %strIceBoxFilePath%
-
-
- 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
- findstr /ric:"creotkdat *.*\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
- 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
- @echo off
-
- REM 获取bat上级路径
-
-
- set "bd=%cd%"
- cd..
- set "bbd=%cd%"
- cd %bd%
- set Newdisk=%bbd%
-
- set strIceBoxFilePath=d:\sec\icebox\icebox.txt
- REM 读取旧盘符
- set Olddisk=
- for /f "tokens=1*" %%i in ('findstr "IceBox\\" "%strIceBoxFilePath%"') do (
- set Olddisk=%%j
- )
- if not defined Olddisk exit /b
- set "prefix=%Olddisk%\."
- @REM echo prefix_before=%prefix%
- :loop3
- for %%A in ("%prefix%") do (
- set "prefix=%%~dpA."
- if /i not "%%~nxA"=="IceBox" if not "%%~pA"=="\" (
- goto loop3
- )
- )
- set "prefix=%prefix:~,-1%"
- @REM echo prefix_after=%prefix%
- REM 读取IceBox_*.dat所有内容
- for /f "eol=! tokens=*" %%l in (%strIceBoxFilePath%) do (
-
-
- REM 设置变量str为每行内容
-
- setlocal EnableDelayedExpansion
- set str=%%l
- REM 如果该行有旧盘符a,则将其改为新盘符A
- set "str=!str:%prefix%=%Newdisk%\!"
-
-
- REM 把修改后的全部行存入$
- echo !str!>>$
- endlocal
-
- )
-
-
- REM 替换原文件
-
-
- move $ %strIceBoxFilePath%
-
- set strConfigFilePath=d:\sec\icebox\icebox.txt
- findstr /ric:"creotkdat *.*\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
- if %errorlevel% equ 1 (
- REM 未找到
- >>%strConfigFilePath% echo creotkdat %Newdisk%\IceBox\IceBox_c4.dat
- goto end
- )
- set reNewdisk=%Newdisk:\=\\%
- set reNewdisk=%reNewdisk:\.=\.%
- REM 找到
- findstr /ric:"creotkdat *%reNewdisk%\\IceBox\\IceBox_c4.dat" %strConfigFilePath%
- REM 不匹配%Newdisk%
-
- 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%\""
-
- :end
- 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编码,同时最上边修改成这样:- @echo off
- chcp 65001
- REM 获取bat上级路径
复制代码
作者: HerveyHu 时间: 2020-11-25 15:50
本帖最后由 HerveyHu 于 2020-11-25 15:51 编辑
回复 12# flashercs
UTF-8的可以读取,目前读取的格式就是这个,这个我在开头有加,文本现在改了,整体代码如下,请帮忙看看,还有没有问题,本人不是IT行业的,所以会的不多,感谢指导!复制代码
作者: HerveyHu 时间: 2020-11-25 15:58
本帖最后由 HerveyHu 于 2020-11-25 15:59 编辑
回复 12# flashercs
刚刚试了改bat编码保存格式,发现被导入修改内容的文件编码被从UTF-8 改成了ANSI,请问可以修改吗?
作者: flashercs 时间: 2020-11-25 19:58
- 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 |