1

Can we skip/escape the equals sign(=) in the String replacement? I m expecting output as "abcde" but It prints "a=b"

set string=a=b
set string=%string:{a=b}=abcde%
echo %string%

Any suggestion?

JPBlanc
  • 70,406
  • 17
  • 130
  • 175
Ada Pongaya
  • 405
  • 4
  • 18
  • The `=` separates the search string from the replace string in the sub-string replacement syntax, so you cannot use it; you can to do the replacement either by writing your own batch script or by borrowing from another language like PowerShell, JavaScript, VBScript... – aschipfl Feb 22 '17 at 17:26
  • 1
    Possible duplicate of [Batch file : how to search and replace a string that have an "=" inside](http://stackoverflow.com/questions/37724410/batch-file-how-to-search-and-replace-a-string-that-have-an-inside) – aschipfl Feb 22 '17 at 20:38

1 Answers1

0

here's one clumsy way:

@echo off

:: the string that contains equals
set "stringWithEquals===blah==blah==blah="
::the string you want to replace with
set replace_with=X1
echo %stringWithEquals%

call :eqrepl "%stringWithEquals%" %replace_with% res
::the result
echo %res%
goto :eof


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: here are the functions you need
::
:eqrepl String Replacer [RtnVar]
setlocal
rem  the result of the operation will be stored here
set "result=#%~1#"
set "replacer=%~2"
call :strlen0 result wl
call :strlen0 replacer rl

:start

  set "part1="
  set "part2="

  rem splitting the string on two parts
  for /f "tokens=1* delims==" %%w in ("%result%") do (
   set "part1=%%w"
   set "part2=%%x"
  )

  rem calculating the count replace strings we should use
  call :strlen0 part1 p1l
  call :strlen0 part2 p2l
  set /a iteration_end=wl-p1l-p2l

  rem creating a sequence with replaced strings
  setlocal enableDelayedExpansion
  set "sequence="
  for /l %%i in (1,1,%iteration_end%) do (
   set sequence=!sequence!%replacer%
  )
  endlocal & set "sequence=%sequence%"

  rem adjust the string length
  set /a wl=wl+iteration_end*(rl-1)

  rem replacing for the current iteration
  set result=%part1%%sequence%%part2%
  rem if the second part is empty the task is over
  if "%part2%" equ "" (
   set result=%result:~1,-1%
   goto :endloop
  )


  goto :start

:endloop
endlocal & if "%~3" neq "" (set %~3=%result%) else echo %result%
exit /b

:strlen0  StrVar  [RtnVar]
  setlocal EnableDelayedExpansion
  set "s=#!%~1!"
  set "len=0"
  for %%N in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if "!s:~%%N,1!" neq "" (
      set /a "len+=%%N"
      set "s=!s:~%%N!"
    )
  )
  endlocal&if "%~2" neq "" (set %~2=%len%) else echo %len%
exit /b
npocmaka
  • 55,367
  • 18
  • 148
  • 187