Batch file: How to replace “=” (equal signs) and a string variable?

前端 未结 6 1807
孤独总比滥情好
孤独总比滥情好 2020-12-10 07:39

Besides SED, how can an equal sign be replaced? And how can I use a string variable in string replacement?

Consider this example:

For /F \"tokens=*\"         


        
6条回答
  •  旧巷少年郎
    2020-12-10 08:08

    UPDATE: The latest version of scripts is here: https://sf.net/p/contools (scripts here: https://sf.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/std/)

    You can use some sequence to temporary replace special characters by placeholders like ?00, ?01, ?02 and ?03. I basically use these set of scripts:

    replace_sys_chars.bat:

    @echo off
    
    rem Description:
    rem   Script to replace ?, !, %, and = characters in variables by respective
    rem   ?00, ?01, ?02 and ?03 placeholders.
    
    setlocal DISABLEDELAYEDEXPANSION
    
    set "__VAR__=%~1"
    
    if "%__VAR__%" == "" exit /b 1
    
    rem ignore empty variables
    call set "STR=%%%__VAR__%%%"
    if "%STR%" == "" exit /b 0
    
    set ?01=!
    
    call set "STR=%%%__VAR__%:?=?00%%"
    set "STR=%STR:!=?01%"
    
    setlocal ENABLEDELAYEDEXPANSION
    
    set STR=!STR:%%=?02!
    set "STR_TMP="
    set INDEX=1
    
    :EQUAL_CHAR_REPLACE_LOOP
    set "STR_TMP2="
    for /F "tokens=%INDEX% delims== eol=" %%i in ("/!STR!/") do set STR_TMP2=%%i
    if "!STR_TMP2!" == "" goto EQUAL_CHAR_REPLACE_LOOP_END
    set "STR_TMP=!STR_TMP!!STR_TMP2!?03"
    set /A INDEX+=1
    goto EQUAL_CHAR_REPLACE_LOOP
    
    :EQUAL_CHAR_REPLACE_LOOP_END
    if not "!STR_TMP!" == "" set STR=!STR_TMP:~1,-4!
    
    (
      endlocal
      endlocal
      set "%__VAR__%=%STR%"
    )
    
    exit /b 0
    

    restore_sys_chars.bat:

    @echo off
    
    rem Description:
    rem   Script to restore ?, !, %, and = characters in variables from respective
    rem   ?00, ?01, ?02 and ?03 placeholders.
    
    setlocal DISABLEDELAYEDEXPANSION
    
    set "__VAR__=%~1"
    
    if "%__VAR__%" == "" exit /b 1
    
    rem ignore empty variables
    call set "STR=%%%__VAR__%%%"
    if "%STR%" == "" exit /b 0
    
    setlocal ENABLEDELAYEDEXPANSION
    
    set STR=!STR:?02=%%!
    set STR=!STR:?03==!
    
    (
      endlocal
      set "STR=%STR%"
    )
    
    set "STR=%STR:?01=!%"
    set "STR=%STR:?00=?%"
    
    (
      endlocal
      set "%__VAR__%=%STR%"
    )
    
    exit /b 0
    

    Example:

    @echo off
    
    setlocal DISABLEDELAYEDEXPANSION
    
    for /F "usebackq tokens=* delims=" %%i in ("test.txt") do (
      set VALUE=%%i
      call :PROCESS
    )
    exit /b 0
    
    :PROCESS
    if "%VALUE%" == "" exit /b 0
    
    set "VALUE_=%VALUE%"
    call replace_sys_chars.bat VALUE_
    
    rem do variable arithmetic here as usual
    if not "%VALUE_:?00=%" == "%VALUE_%" echo."%VALUE%" having ?
    if not "%VALUE_:?01=%" == "%VALUE_%" echo."%VALUE%" having !
    if not "%VALUE_:?02=%" == "%VALUE_%" echo."%VALUE%" having %%
    if not "%VALUE_:?03=%" == "%VALUE_%" echo."%VALUE%" having =
    
    rem restore it
    call restore_sys_chars.bat VALUE_
    echo "VALUE=%VALUE_%"
    
    echo.---
    

    test.txt:

    111/222
    AAA=BBB
    CCC=%DDD%
    EEE=!FFF!
    FFF=?00?01?02?03
    

    Result:

    "VALUE=111/222"
    ---
    "AAA=BBB" having =
    "VALUE=AAA=BBB"
    ---
    "CCC=%DDD%" having %
    "CCC=%DDD%" having =
    "VALUE=CCC=%DDD%"
    ---
    "EEE=!FFF!" having !
    "EEE=!FFF!" having =
    "VALUE=EEE=!FFF!"
    ---
    "FFF=?00?01?02?03" having ?
    "FFF=?00?01?02?03" having =
    "VALUE=FFF=?00?01?02?03"
    ---
    

    Features:

    • You can continue use standard batch variable arithmetic between conversions
    • You can use character placeholders (?00, ?01, ?02, ?03) as plain variable values

提交回复
热议问题