批处理文件:如何替换"="(等号)和字符串变量?

Tin*_*nth 5 string replace cmd batch-file

除了SED,如何更换等号?如何在字符串替换中使用字符串变量?

考虑这个例子:

For /F "tokens=*" %%B IN (test.txt) DO (
   SETLOCAL ENABLEDELAYEDEXPANSION
   SET t=is
   SET old=%%B
   SET new=!old:t=!
   ECHO !new!

   ENDLOCAL
)

:: SET new=!old:==!
Run Code Online (Sandbox Code Playgroud)

两个问题:

首先,我不能在!:=!中使用变量%t%.

   SET t=is
   SET old=%%B
   SET new=!old:t=!
Run Code Online (Sandbox Code Playgroud)

其次,我无法替换命令行中的等号

   SET new=!old:==!
Run Code Online (Sandbox Code Playgroud)

tim*_*g07 6

我自己刚刚为此创建了一个简单的解决方案,也许它可以帮助某人。

缺点(或优点,取决于您想要做什么)是多个等号一个接一个地处理,就像一个等号一样。(例如:“str==ing”给出与“str=ing”相同的输出)

@echo off
set "x=this is=an test="
echo x=%x%

call :replaceEqualSign in x with _
echo x=%x%

pause&exit


:replaceEqualSign in <variable> with <newString>
    setlocal enableDelayedExpansion

        set "_s=!%~2!#"
        set "_r="

        :_replaceEqualSign
            for /F "tokens=1* delims==" %%A in ("%_s%") do (
                if not defined _r ( set "_r=%%A" ) else ( set "_r=%_r%%~4%%A" )
                set "_s=%%B"
            )
        if defined _s goto _replaceEqualSign

    endlocal&set "%~2=%_r:~0,-1%"
exit /B
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以像这样使用该函数:

call :replaceEqualSign in variableName with newString
Run Code Online (Sandbox Code Playgroud)