因此,在使此批处理文件正常工作时遇到了一些麻烦。我尝试了几种不同的方法来查找和替换字符串。
问题:我们必须经常更新数据库,这样做会更改文件。我必须改回一个文件才能正常工作。这行:
<network ipAdress="172.24.55.32" networkPort="9100" />
更改为这一行:
<file filename="fffff" />
并需要更改回具有IP地址的第一行。
我尝试使用查找和替换子例程,并且可以将其用于将“文件名”更改为“网络ipAdress”的第一部分,但是第二部分中的引号使脚本无法正常工作。这是我所拥有的代码。
@echo off
setlocal
call :FindReplace "file filename" "network ipAdress" BCPrint.XML
Timeout 2
call :FindReplace "fffff" "172.24.55.32" networkPort="9100" BCPrint.XML
exit /b
:FindReplace <findstr> <replstr> <file>
set tmp="%temp%\tmp.txt"
If not exist %temp%\_.vbs call :MakeReplace
for /f "tokens=*" %%a in ('dir "%3" /s /b /a-d /on') do (
for /f "usebackq" %%b in (`Findstr /mic:"%~1" "%%a"`) do (
echo(&Echo Replacing "%~1" with "%~2" in file %%~nxa
<%%a cscript //nologo %temp%\_.vbs "%~1" "%~2">%tmp%
if exist %tmp% move /Y %tmp% "%%~dpnxa">nul
)
)
del %temp%\_.vbs
exit /b
:MakeReplace
>%temp%\_.vbs echo with Wscript
>>%temp%\_.vbs echo set args=.arguments
>>%temp%\_.vbs echo .StdOut.Write _
>>%temp%\_.vbs echo Replace(.StdIn.ReadAll,args(0),args(1),1,-1,1)
>>%temp%\_.vbs echo end with
我也尝试将第二部分设置为变量,例如:
set R2=172.24.55.32" networkPort="9100
call :FindReplace "file filename" "network ipAdress" BCPrint.XML
Timeout 2
call :FindReplace "fffff" "%R2%" BCPrint.XML
以及转义字符:
set ^R2=172.24.55.32" networkPort="9100^
我敢肯定,我尝试了几种不使用转义字符而不列出变量的方法,而没有使用变量。我已经结束了我所能找出的一切。
有没有一种方法可以找到具有特殊字符的行并将其替换为具有特殊字符的行?关于如何使用引号和空格对整行或第二部分做任何建议都很好。谢谢你的时间。
最佳答案
下载编写的JREPL.BAT Dave Benham ,这是一个批处理文件/ JScript混合文件,可使用JScript在文件上运行正则表达式替换并将其存储在与以下批处理文件相同的目录中。
@echo off
call "%~dp0jrepl.bat" "file filename=\x22fffff" "network ipAdress=\x22172.24.55.32\x22 networkPort=\x229100" /XSEQ /F BCPrint.XML /O -
\x22
是以十六进制形式指定的"
,因为参数字符串不能包含双引号字符。关于file - 使用批处理文件查找并用特殊字符替换字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50823813/