[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样对xml文件里的指定字符串替换成指定序号?

执行后,1。选择要处理的xml文件,
2。设置要替换的自定字符串,(如:xuayin123456)
3。设置替换后的字符串规则,(如:替换成x-序号,序号为每替换一次序号自动加1,从1开始)
4。保存为同目录下的同名加后缀文件。(如 xxx-test.xml)
从网上找了一个代码,但是无法实现第三步,已经卡了2天了,求助大佬帮忙看看,(附件为要处理的测试用例)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set file=
  4. set /p file= 请拖入要操作的文件名称(包括扩展名):
  5. set "file=%file:"=%"
  6. for %%i in ("%file%") do set file=%%~fi
  7. echo.
  8. set replaced=
  9. set /p replaced= 请输入即将被替换的内容:
  10. echo.
  11. set all=
  12. set /p all= 请输入替换字符串:
  13. for /f "delims=" %%i in ('type "%file%"') do (
  14. set str=%%i
  15. set "str=!str:%replaced%=%all%!"
  16. echo !str!>>"%file%"_tmp.xml
  17. )
复制代码

本帖最后由 WHY 于 2021-1-6 19:32 编辑

如果要这样的话,直接用 PowerShell 脚本好了。
  1. $file = Read-Host('拖入要操作的文件');
  2. $srcStr = Read-Host('输入即将被替换的内容');
  3. $dstStr = Read-Host('输入替换后的字符串');
  4. $file = $file.Replace('"', '');
  5. $arr = (gc -Literal $file -Enc UTF8 -ReadCount 0) -join "`r`n" -split [regex]::Escape($srcStr);
  6. $count = $arr.Count - 1;
  7. for($i=0; $i -lt $count; $i++){
  8.     $arr[$i] += $dstStr + ($i + 1);
  9. }
  10. sc -Literal ($file + '_tmp.xml') -Enc UTF8 -Value ($arr -join '');
  11. echo 'Done';
  12. [console]::ReadKey();
复制代码

TOP

回复 7# WHY


    大佬厉害,就差点点了,现在结果是同行的话还是一样的,如一行中有www,替换结果如:x_3x_3x_3,期望的结果是:x_3x_4x_5,每替换一次序号加一,不需要区分行一直累加,直到加到最后一次

TOP

test.bat,保存时选编码:utf-8 without BOM
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 65001
  4. set file=
  5. set /p file=请拖入要操作的文件名称(包括扩展名):
  6. set "file=%file:"=%"
  7. for %%i in ("%file%") do set file=%%~fi
  8. echo.
  9. set replaced=
  10. set /p replaced=请输入即将被替换的内容:
  11. echo.
  12. set all=
  13. set /p all=请输入替换字符串:
  14. (for /f "delims=" %%i in ('type "%file%"') do (
  15.     set "str=%%i"
  16.     if "!str:%replaced%=!" NEQ "!str!" (
  17.         set /a n+=1
  18.         for %%j in (!n!) do (
  19.             set "str=!str:%replaced%=%all%_%%j!"
  20.         )
  21.     )
  22.     echo;!str!
  23. ))>"%file%"_tmp.xml
复制代码

TOP

回复 5# qixiaobin0715


    试过了,没效果,还是提示:echo关闭状态

TOP

回复 4# xay
你的测试文件编码为UTF-8,另存为ANSI试试。

TOP

回复 3# qixiaobin0715


    现在上面运行都是没问题的,但是现在想要实现第三步的操作,我在for里加了句:set /a all=all+1,结果提示:ECHO 处于关闭状态。一直卡在着

TOP

本帖最后由 qixiaobin0715 于 2021-1-6 08:39 编辑

如果对批处理不熟悉的话尽量少用“set /p”的形式,有些情况会出问题。比如上面代码运行时,拖入的文件其文件名含有空格,变量值会自动加上引号,后面引用的变量如果变量名已经有双引号,取值是就有两层双引号,会出问题。

TOP

将xml测试文件和bat文件用记事本打开,另存为ANSI编码试试。

TOP

返回列表