目前,我有script执行以下操作:
最后一步是我的问题所在。目前,当批处理文件读取XML文件时,它会丢失感叹号。出口前,样品行是:
<url><![CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url>
结果
<url><[CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url>
如何保持感叹号?
答案 0 :(得分:2)
展开可能包含!
文字的FOR变量时,必须确保未启用延迟扩展。您可以修改:replaceCourseInfo例程以在循环内打开和关闭延迟扩展,而不是在例程顶部打开它。
我同意foxidrive,我不知道修改后的变量是如何被使用的,所以我把它剥离了。
:replaceCourseInfo
@echo off
setlocal
set INTEXTFILE=%~1
set OUTTEXTFILE=%~1
copy %INTEXTFILE% %INTEXTFILE%.bak
copy %INTEXTFILE% %INTEXTFILE%.original.bak
set BAKFILE=%~1.bak
if exist "%~1.bak" del /F /Q "%~1.bak"
REM Walk through XML Lines
REM @todo Need to prevent losing ! in [!CDATA[
for /F "delims=" %%U in (%~1) do (
set LINE=%%U
setlocal enabledelayedexpansion
if not "!LINE!" == "!LINE:%~2=!" (
set LINE=!LINE:%~2=%~3!
)
>> "%BAKFILE%" echo.!LINE!
endlocal
)
REM If modified, delete original, copy modified bak as new original
if NOT "%~2"=="%~3" (
del /F /Q %~1
copy %BAKFILE% %~1
)
goto:eof
我曾经使用FOR / F循环来修改文本文件,但获得所需结果通常很复杂。我编写了foxidrive所说的REPL.BAT脚本,现在我几乎总是使用REPL.BAT而不是FOR / F循环来修改文件。 REPL.BAT更简单,更快捷。
答案 1 :(得分:0)
问题是delayed expansion
- 可以解决。
您使用的是以下代码 - modified
变量未被明显使用。
如果字符串中存在%~2
,您的代码似乎只是将%~3
替换为%~2
,这可以通过dbenham或REPL.BAT
使用SED
来完成或VBS search and replace feature
。
REM Walk through XML Lines
REM @todo Need to prevent losing ! in [!CDATA[
for /F "delims=" %%U in (%~1) do (
set LINE=%%U
if not "!LINE!" == "!LINE:%~2=!" (
set LINE=!LINE:%~2=%~3!
set modified=!string:%~2=%~3!
)
>> "%BAKFILE%" echo. LINE!
)
以下是替换上述代码的REPL.BAT
解决方法:
type "%~1" | REPL "%~2" "%~3" L >> "%BAKFILE%"