标题: [文本处理] 批处理怎样对xml文件里的指定字符串替换成指定序号? [打印本页]
作者: xay 时间: 2021-1-5 20:35 标题: 批处理怎样对xml文件里的指定字符串替换成指定序号?
执行后,1。选择要处理的xml文件,
2。设置要替换的自定字符串,(如:xuayin123456)
3。设置替换后的字符串规则,(如:替换成x-序号,序号为每替换一次序号自动加1,从1开始)
4。保存为同目录下的同名加后缀文件。(如 xxx-test.xml)
从网上找了一个代码,但是无法实现第三步,已经卡了2天了,求助大佬帮忙看看,(附件为要处理的测试用例)- @echo off
- setlocal enabledelayedexpansion
- set file=
- set /p file= 请拖入要操作的文件名称(包括扩展名):
- set "file=%file:"=%"
- for %%i in ("%file%") do set file=%%~fi
- echo.
- set replaced=
- set /p replaced= 请输入即将被替换的内容:
- echo.
- set all=
- set /p all= 请输入替换字符串:
- for /f "delims=" %%i in ('type "%file%"') do (
- set str=%%i
- set "str=!str:%replaced%=%all%!"
- echo !str!>>"%file%"_tmp.xml
- )
复制代码
作者: qixiaobin0715 时间: 2021-1-5 22:51
将xml测试文件和bat文件用记事本打开,另存为ANSI编码试试。
作者: qixiaobin0715 时间: 2021-1-6 08:36
本帖最后由 qixiaobin0715 于 2021-1-6 08:39 编辑
如果对批处理不熟悉的话尽量少用“set /p”的形式,有些情况会出问题。比如上面代码运行时,拖入的文件其文件名含有空格,变量值会自动加上引号,后面引用的变量如果变量名已经有双引号,取值是就有两层双引号,会出问题。
作者: xay 时间: 2021-1-6 09:11
回复 3# qixiaobin0715
现在上面运行都是没问题的,但是现在想要实现第三步的操作,我在for里加了句:set /a all=all+1,结果提示:ECHO 处于关闭状态。一直卡在着
作者: qixiaobin0715 时间: 2021-1-6 09:21
回复 4# xay
你的测试文件编码为UTF-8,另存为ANSI试试。
作者: xay 时间: 2021-1-6 09:37
回复 5# qixiaobin0715
试过了,没效果,还是提示:echo关闭状态
作者: WHY 时间: 2021-1-6 10:37
test.bat,保存时选编码:utf-8 without BOM- @echo off
- setlocal enabledelayedexpansion
- chcp 65001
- set file=
- set /p file=请拖入要操作的文件名称(包括扩展名):
- set "file=%file:"=%"
- for %%i in ("%file%") do set file=%%~fi
- echo.
- set replaced=
- set /p replaced=请输入即将被替换的内容:
- echo.
- set all=
- set /p all=请输入替换字符串:
- (for /f "delims=" %%i in ('type "%file%"') do (
- set "str=%%i"
- if "!str:%replaced%=!" NEQ "!str!" (
- set /a n+=1
- for %%j in (!n!) do (
- set "str=!str:%replaced%=%all%_%%j!"
- )
- )
- echo;!str!
- ))>"%file%"_tmp.xml
复制代码
作者: xay 时间: 2021-1-6 14:53
回复 7# WHY
大佬厉害,就差点点了,现在结果是同行的话还是一样的,如一行中有www,替换结果如:x_3x_3x_3,期望的结果是:x_3x_4x_5,每替换一次序号加一,不需要区分行一直累加,直到加到最后一次
作者: WHY 时间: 2021-1-6 18:42
本帖最后由 WHY 于 2021-1-6 19:32 编辑
如果要这样的话,直接用 PowerShell 脚本好了。- $file = Read-Host('拖入要操作的文件');
- $srcStr = Read-Host('输入即将被替换的内容');
- $dstStr = Read-Host('输入替换后的字符串');
-
- $file = $file.Replace('"', '');
- $arr = (gc -Literal $file -Enc UTF8 -ReadCount 0) -join "`r`n" -split [regex]::Escape($srcStr);
- $count = $arr.Count - 1;
- for($i=0; $i -lt $count; $i++){
- $arr[$i] += $dstStr + ($i + 1);
- }
- sc -Literal ($file + '_tmp.xml') -Enc UTF8 -Value ($arr -join '');
-
- echo 'Done';
- [console]::ReadKey();
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |