2017-02-22 57 views
1

我們可以跳過/逃脫等於在字符串替換等號(=)? 我米期待輸出作爲「ABCDE」但它打印「A = B」如何跳過一個特殊字符(=)的字符串替換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