.bat使⽤powershell搜索并替换带有等号的字串
当要替换的字符带有等号和引号时,直接替换会导致.bat⽂件只替换等号前的部分
举例:如想将“format="10""替换为"format="5""
普通字符串替换⽅法
@echo off
powershell怎么以管理员身份运行chcp 65001 >nul
setlocal enabledelayedexpansion
set path=%~dp0
set l
set originalStr="format=\"10\""
set targetStr="format=\"5\""
rem 遍历⽂件中的每⼀⾏
for /f "delims=" %%x in (%path%\%file%) do (
set line=%%x
rem 替换该⾏中相应的字符串,并写⼊tmp⽂件
set "line=!line:%originalStr%=%targetStr%!"
echo !line!>&
)
rem 替换完成后回写
l
l is replaced!
pause
问题:set "line=!line:%originalStr%=%targetStr%!" 等价于
set "line=!line:format="10"=format="5"!"
导致脚本会在识别到第⼀个等号时就判定开始替换,
从⽽将”format“替换为”"10"=format="5"“
即得到错误结果””"10"=format="5"=“10”“
解决:查阅了好久资料,发现最快捷的解决⽅案是使⽤win7以后系统⾃带的powershell,可以调⽤bash下的各种命令,直接调⽤replace 命令修改,就可以修改成功啦
@echo off
chcp 65001 >nul
rem 设置延迟变量
setlocal enabledelayedexpansion
rem batPath:.bat运⾏路径  path:要搜索和修改的⽂件夹  file:要修改的⽂件  originalStr:原始的字符串  targetStr:要改成的字符串
set batPath=%~dp0
set path=%batPath%\Config
set file=*.xml
set originalStr="format=\"10\""
set targetStr="format=\"5\""
rem 删除TLV开头的xml⽂件
del /S %path%\TLV*.xml
rem 遍历.xml格式的⽂件
for /r "%path%" %%c in ("%file%") do (
set fileName=%%c
rem 查⽂件内是否包含字符串
findstr %originalStr% !fileName!
if !errorlevel!==0 (
rem 调⽤powershell的replace命令替换并重新写⼊
%SYSTEMROOT%\System32\WindowsPowerShell\v1. -Command "(gc !fileName!) -replace '%originalStr%', '%targetStr%' | Out-File -encoding u echo !fileName! is replaced
) else (
echo not found in !fileName!
)
)
pause
需要注意的点:
1. ⼀定要设置延迟变量,并⽤ !errrorlevel! ⽅式判断findstr返回值,findstr后的if判断才会起作⽤
2. 字符串最好都⽤引号括起来,字符串本⾝的引号需要⽤ \ 进⾏转义
3. powershell应该需要再设置⼀下环境变量path:%SYSTEMROOT%\System32\WindowsPowerShell\v1.0
4. 我在使⽤时findstr必须使⽤管理员⾝份运⾏才能调⽤,否则会报错" findstr is not recognized as an internal or external
command"

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。