Batch批处理查找包含引号的XML标签子串失败问题求助
问题根因
你遇到的匹配失效有两个核心问题:
- 批处理的变量替换语法
!line:search=replace!中,search位置默认读取字面量字符串,你直接写变量名myVariable不会自动读取该变量的存储值,系统只会尝试匹配行里的myVariable字符串,自然匹配失败。 - 目标搜索串里包含
<重定向特殊符号,没有转义会被系统识别为IO操作,导致变量实际赋值结果和预期不符。
修复方案
方案1:沿用原有替换匹配逻辑,修正语法和转义
修改搜索变量赋值和匹配逻辑的写法,示例如下:
REM 注意<符号前加^转义,外层用引号包裹保证内部引号正常识别 SET "searchStr=^<assemblyIdentity name="PostDeploymentAction" version" REM 先把搜索串赋值到临时变量,再做替换匹配 IF not "!line!"=="!line:%searchStr%=!" ( ECHO 匹配到目标行:!line! REM 此处添加你的行修改逻辑 )
方案2:用findstr做匹配,稳定性更高(推荐)
不需要处理复杂的变量替换转义,直接用系统自带的字符串匹配命令判断,容错率更高:
REM /c参数表示匹配完整连续字符串,>nul屏蔽命令输出 ECHO !line! | findstr /c:"<assemblyIdentity name=\"PostDeploymentAction\" version" >nul 2>&1 IF !errorlevel! EQU 0 ( ECHO 匹配到目标行:!line! REM 此处添加你的行修改逻辑 )
整合修复后的代码片段
@ECHO OFF SETLOCAL EnableExtensions EnableDelayedExpansion ....some more code.... SET dllFile=%DestPath%\%ProjectName%.dll.manifest IF NOT EXIST "%dllFile%" ( ECHO File %ProjectName%.dll.manifest does not exist^^! GOTO ERROR ) ELSE ( ECHO Modifying %ProjectName%.dll.manifest in directory: ECHO %DestPath% REM Create a temporary file in the folder, where this batch file is being executed from >"temp.xml" ( FOR /F "usebackq delims=" %%I IN ("%dllFile%") DO ( SET "line=%%I" REM 匹配目标行 ECHO !line! | findstr /c:"<assemblyIdentity name=\"PostDeploymentAction\" version" >nul 2>&1 IF !errorlevel! EQU 0 ( REM 此处添加你的行修改逻辑,例如替换版本号 SET "line=!line:旧版本号=新版本号!" ) REM 输出处理后的行 SETLOCAL DisableDelayedExpansion ECHO !line! ENDLOCAL ....some more code.... ) ) )
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

