2017-02-22 33 views
1

Можем ли мы пропустить/вывести знак равенства (=) в замене строки? я м ожидая выхода, как "ABCDE" но Он печатает "а = Ь"Как пропустить специальный символ (=) в подстановке строк Команда Windows

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

Любое предложение?

+0

Параметр '=' отделяет строку поиска из замены строки в синтаксисе замены подстрок, так что вы не можете использовать его; вы можете сделать замену либо путем написания собственного сценария партии, либо путем заимствования с другого языка, такого как PowerShell, JavaScript, VBScript ... – aschipfl

+1

Возможный дубликат [Пакетный файл: как искать и заменять строку с «=» внутри ] (http://stackoverflow.com/questions/37724410/batch-file-how-to-search-and-replace-a-string-that-have-an-inside) – aschipfl

ответ

0

вот один неуклюжий способ:

@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