我想一次查找并替换单个或多个XML文件中的多个字符串。我试过参数化xml输入文件并传递变量以查找和替换匹配模式。使用for
循环非常耗时,因为它是嵌套for
循环。我们可以用“如果存在”写吗
代码如下:
-用于查找/替换脚本
@echo off
setlocal enableextensions disabledelayedexpansion
set "search="%~1""
set "replace="%~2""
set "textfile=%3"
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>"%textFile%" echo(!line!
endlocal
)
-输入变量
@echo off
set source=<SRCpath>"
set target=<TGTpath>
xcopy /Y %<SRC>%\* %<TGT>%\*
dir /s /b "%TGT%\*.xml" > filenames.txt -- for multi i/p files
set filename="<i/p>\filenames.txt"
set paramfile="<variable values path>\parm.txt"
FOR /F "tokens=*" %%i IN ('type "%filenames%"') DO (
for /f "tokens=1,2 delims=" %%j in ('type "%parm%"') do call <Find/Replace script.bat> %%j %%k %%i
)
打扰一下。如果我正确理解了您的评论,那么您的问题就不是“在XML文件中查找和替换多个字符串”(因为您已经有解决该问题的代码),而是有效地做到了!您的要求应该非常清楚,否则您将得到无法解决问题的答案(浪费了尝试帮助您的人员的时间)。
您的代码有几种构造特别慢。下面的代码使用相同的方法“查找和替换字符串”,但是使用了更有效的构造。
@echo off
set source=<SRCpath>"
set target=<TGTpath>
xcopy /Y %<SRC>%\* %<TGT>%\*
set paramfile="<variable values path>\parm.txt"
rem Process all .xml files
FOR /F "tokens=*" %%f in ('dir /s /b "%TGT%\*.xml"') do (
rem Process all lines in each file
(for /f "usebackq delims=" %%i in ("%%f") do (
set "line=%%i"
setlocal EnableDelayedExpansion
rem Replace all strings in paramfile
for /f "usebackq tokens=1,2" %%j in ("%parm%") do (
set "line=!line:%%j=%%k!"
)
echo(!line!
endlocal
)) > tempfile.tmp
move /Y tempfile.tmp "%%f"
)
请注意,我使用了与您完全相同的代码,并且只是重新排列了代码以提高性能。这意味着您必须修复代码可能包含的所有缺失值,错误等。
编辑:添加替换行的范围
下面的修改允许指定特定范围的行来执行查找/替换;批处理文件的参数中提供了可选范围。
@echo off
setlocal
set "ifInRange="
set "endIf="
rem If two parameters are given, they specify the desired range of lines for replacements
if "%~2" equ "" goto begin
set "ifInRange=if %%h geq %1 if %%h leq %2 ("
set "endIf=)"
:begin
set source=<SRCpath>"
set target=<TGTpath>
xcopy /Y %<SRC>%\* %<TGT>%\*
set paramfile="<variable values path>\parm.txt"
rem Process all .xml files
FOR /F "tokens=*" %%f in ('dir /s /b "%TGT%\*.xml"') do (
rem Process all lines in each file
(for /f "tokens=1* delims=:" %%h in ('findstr /N "^" "%%f"') do (
set "line=%%i"
setlocal EnableDelayedExpansion
rem Check if a line range was given
%ifInRange%
rem Replace all strings in paramfile
for /f "usebackq tokens=1,2" %%j in ("%parm%") do (
set "line=!line:%%j=%%k!"
)
%endIf%
echo(!line!
endlocal
)) > tempfile.tmp
move /Y tempfile.tmp "%%f"
)
编辑2:回复评论
您可以将行范围指定为批处理文件的参数。例如,要处理20到60行:
batchFileName.bat 20 60
但是,如果行的范围始终相同,则可以通过以下方式简化代码:
@echo off
setlocal
set source=<SRCpath>"
set target=<TGTpath>
xcopy /Y %<SRC>%\* %<TGT>%\*
set paramfile="<variable values path>\parm.txt"
rem Process all .xml files
FOR /F "tokens=*" %%f in ('dir /s /b "%TGT%\*.xml"') do (
rem Process all lines in each file
(for /f "tokens=1* delims=:" %%h in ('findstr /N "^" "%%f"') do (
set "line=%%i"
setlocal EnableDelayedExpansion
rem Check if the line is in range
if %%h geq 20 if %%h leq 60 (
rem Replace all strings in paramfile
for /f "usebackq tokens=1,2" %%j in ("%parm%") do (
set "line=!line:%%j=%%k!"
)
)
echo(!line!
endlocal
)) > tempfile.tmp
move /Y tempfile.tmp "%%f"
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句