Batch file 如何搜索和替换具有等号“的字符串”=&引用;在…内

Batch file 如何搜索和替换具有等号“的字符串”=&引用;在…内,batch-file,replace,cmd,special-characters,Batch File,Replace,Cmd,Special Characters,我必须从像Pippo.K=5这样的txt文件中搜索一个字符串,并将其替换为Pippo.K=1。我需要搜索整个字符串。我所做的是: set "search=Pippo.K=5" set "replace=Pippo.K=1" set "textFile=%SettingFile%.txt" for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do ( set "line=%%i"

我必须从像Pippo.K=5这样的txt文件中搜索一个字符串,并将其替换为Pippo.K=1。我需要搜索整个字符串。我所做的是:

set "search=Pippo.K=5"
set "replace=Pippo.K=1"
set "textFile=%SettingFile%.txt"
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    >>"%textFile%" echo(!line!
    endlocal
)
但我回来的是
5=Pippo.K=1=5


如何修复此错误?

批处理变量子字符串替换有限制。处理字面上的等号就是其中之一

powershell“(gc\%textFile%\”)-替换“%search%”、“%replace%”
会有用的。PowerShell one liner是无此限制的
for/f
循环的简单替代品


如果您喜欢使用
for/F
循环,如果您的文本文件是ini样式的文件,请尝试以下操作:

@echo off&setlocal
设置“searchItem=Pippo.K”
设置“searchVal=5”
设置“newVal=1”
设置“textFile=test.txt”
>“outfile.txt”(
对于/f“eol=;usebackq令牌=1*delims==”%%I in(“%textFile%”)do(
如果/I“%%~I”=%searchItem%”(
如果“%%~J”=%searchVal%”(
echo%%I=%newVal%
)else echo%%I=%%J
)否则(
如果不是“%%~J”==”(echo%%I=%%J),则为echo%%I
)
)
)
移动/y“outfile.txt”“%textFile%”
请注意,如果文件中的任何项具有空值(例如,
valuename=
),除非添加一些附加逻辑,否则等号将被删除


你也可以考虑使用.

下面的脚本构成一个纯的解决方案。假设它存储为

repl-str.bat
,您需要在应用程序中这样调用它:

repl-str.bat "%SettingFile%.txt" "Pippo.K=5" "Pippo.K=1" "%SettingFile%.txt"
这将指定输入文件
%SettingFile%.txt
、文本和区分大小写的搜索字符串
Pippo.K=5
、替换字符串
Pippo.K=1
以及与输入文件相同的输出文件
%SettingFile%.txt
(相关技术取自此答案:)。如果没有给出输出文件,结果将输出到控制台(用于测试)。如果给出了第五个命令行参数(任意值),则以区分大小写的方式进行搜索

以下是脚本的代码
repl-str.bat

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“文件I=%~1”
设置“搜索=%~2”
设置“REPLAC=%~3”
设置“FILE_O=%~4”
设置“CASE=%~5”
设置“标志=%~6”
如果未定义文件\u I退出/B 1
如果未定义搜索退出/B 1
如果未定义文件,则设置“文件”\u O=con
如果定义了案例集“案例=#”
如果已定义标志,则设置“标志=#”
对于/F“delims=”%%L in('
findstr/N/R“^”“%FILE\u I%”^&break^>“%FILE\u O%”
""做"(
设置“字符串=%%L”
setlocal EnableDelayedExpansion
设置“字符串=!字符串:*=!”
调用:REPL返回字符串搜索重播“%CASE%”%FLAG%
>>“%FILE\u O%”回显(!RETURN!
端部
)
端部
退出/B
:REPL rtn_string ref_string ref_search ref_replac case标志
setlocal EnableDelayedExpansion
设置“STR=!%~2!”
设置“SCH=!%~3!”
设置“RPL=!%~4!”
如果“%~5”==”(设置“OPT=/I”)其他(设置“OPT=”)
如果未定义SCH endlocal&设置“%~1=”退出/B 1
设置“SCH_CHR=!SCH:~,1!”
如果不是“%~6”==”设置“SCH_CHR=”
如果“!SCH_CHR!”==“set”SCH_CHR=“&rem=终止搜索字符串
如果“!schu-CHR!”==“^”设置“schu-CHR=“&rem”可能会扰乱语法
如果“!SCH_CHR!”=“%%”设置“SCH_CHR=”&rem%结束变量扩展
如果“!SCH_CHR!”=”^!“set”SCH_CHR=“&rem!”结束变量扩展
电话:LEN SCH_LEN SCH
电话:LEN RPL_LEN RPL
设置/A红色透镜=SCH透镜-1
设置“RES=”
:循环
电话:LEN STR_LEN STR
如果未定义STR goto:END
如果定义了SCH_CHR(
设置“WRK=!STR:**%SCH\U CHR%=!”
如果%OPT%“!WRK!”==“!STR!”(
设置“RES=!RES!!STR!”
设置“STR=”
)否则(
电话:LEN wrku LEN WRK
设置/A DFF_LEN=STR_LEN-WRK_LEN-1,INC_LEN=DFF_LEN+1,MOR_LEN=DFF_LEN+SCH_LEN
对于/F“tokens=1,2,3 delims=,”%%M in(“!DFF_LEN!,!INC_LEN!,!MOR_LEN!”)do(
rem集合“RES=!RES!!STR:~,%%M!”
如果定义了WRK集合“WRK=!WRK:~,%RED\u LEN%!”
如果%OPT%“!STR:~%%M,1!!WRK!”==“!SCH!”(
设置“RES=!RES!!STR:~,%%M!!RPL!”
设置“STR=!STR:~%%O!”
)否则(
设置“RES=!RES!!STR:~,%%N!”
设置“STR=!STR:~%%N!”
)
)
)
)否则(
如果%OPT%“!STR:~,%SCH_LEN%!”==“!SCH!”(
设置“RES=!RES!!RPL!”
设置“STR=!STR:~%schu LEN%!”
)否则(
设置“RES=!RES!!STR:~,1!”
设置“STR=!STR:~1!”
)
)
转到:循环
:结束
如果定义了RES(
对于(“!RES!”中的/F delims^=^eol^=%%S,请执行以下操作(
端部
设置“%~1=%%S”
)
)else endlocal&设置“%~1=”
退出/B
:LEN rtn\u长度参考字符串
setlocal EnableDelayedExpansion
设置“STR=!%~2!”
如果未定义STR(set/A LEN=0),则为其他(set/A LEN=1)
对于%%L英寸(4096 2048 1024 512 256 128 64 32 16 8 4 2 1),请执行以下操作(
如果定义STR(
设置“INT=!STR:~%%L!”
如果不是“!INT!”==”集/A LEN+=%%L&集“STR=!INT!”
)
)
endlocal&设置“%~1=%LEN%”
退出/B
基本上,这种方法采用搜索字符串的第一个字符并在输入文本中查找。每次匹配时,都会检查整个搜索字符串是否出现。如果出现这种情况,则通过删除搜索字符串所包含的尽可能多的字符,将其替换为替换字符串,从而避免子字符串替换语法失败如果搜索字符串包含
=
,或者搜索或替换字符串包含
%


但是,如果搜索字符串的第一个字符是
=
%
,则方法不同,脚本会检查每个字符位置是否出现搜索字符串,这会降低整体性能。如果给出第六个命令行参数(任意值),这个(慢)模式被强制。

你能提供一些样本输入数据或摘录(由你的问题帖子)吗?嘿,斯特拉,如果下面的任何答案是有用的,请考虑把一个标记为ACCE。