I offer a perhaps easier solution for replacing each tilde character in value string of an environment variable by a tilde in braces than Dennis van Gils which works also fine for this task.
@echo off
set "TestVar=hello~world."
echo TestVar has value: %TestVar%
call :SpecialReplace "TestVar"
echo TestVar has value: %TestVar%
goto :EOF
rem The subroutine below expects the name of an environment variable as
rem parameter. The subroutine does nothing if called without parameter.
rem Also nothing is done if specified environment variable is not defined.
rem Each tilde character in value of this environment variable is replaced
rem by {~} by this subroutine.
rem Note: This subroutine can be also easily modified to replace other
rem special characters like the equal sign by a different string which
rem can be also no string in case of special character should be removed.
rem Just modify Search and Replace variables for a different replace. But
rem be aware of more code must be changed if search string is longer than
rem one character. Length of replace string does not matter on code below.
:SpecialReplace
if "%~1" == "" exit /B
setlocal EnableDelayedExpansion
set "VarName=%~1"
set "VarValue=!%VarName%!"
if "!VarValue!" == "" endlocal & exit /B
set "NewValue="
set "Search=~"
set "Replace={~}"
:ReplaceLoop
if "!VarValue:~0,1!" == "!Search!" (
set "NewValue=!NewValue!!Replace!"
) else (
set "NewValue=!NewValue!!VarValue:~0,1!"
)
set "VarValue=!VarValue:~1!"
if not "!VarValue!" == "" goto ReplaceLoop
endlocal & set "%VarName%=%NewValue%" & exit /B
For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
call /?
echo /?
endlocal /?
exit /?
goto /?
if /?
rem /?
set /?
setlocal /?
And see also answer on Single line with multiple commands using Windows batch file to understand how the two lines with multiple commands with a single ampersand between the commands work.
A variant of above with an extended subroutine SpecialReplace
supporting now variable search and replace strings specified as second and third parameter as suggested by Dennis van Gils.
@echo off
set "TestVar=hello~world."
echo TestVar has value: %TestVar%
call :SpecialReplace "TestVar" "~" "{~}"
echo TestVar has value: %TestVar%
goto :EOF
rem The subroutine below expects the name of an environment variable as
rem first parameter. The subroutine does nothing if called without parameter.
rem Also nothing is done if specified environment variable is not defined.
rem The second parameter must be the search string. The subroutine does
rem nothing if there is no second parameter which can be also just one
rem or two double quotes enclosed in double quotes.
rem The third parameter is an optional replace string. Without a third
rem parameter all occurrences of search string are removed from value
rem of the specified environment variable.
rem With just one or two double quotes in double quotes as search string
rem no replace string can be defined because command processor does not
rem parse the quote strings as most would expect it. But """ or """" as
rem search string with no replace string works and results in removing
rem all double quotes or all occurrences of two double quotes.
:SpecialReplace
if "%~1" == "" exit /B
setlocal EnableDelayedExpansion
set "VarName=%~1"
set "VarValue=!%VarName%!"
if "!VarValue!" == "" endlocal & exit /B
set "NewValue="
set "Search=%~2"
if "!Search!" == "" endlocal & exit /B
set "Replace=%~3"
set "Length=0"
:GetLength
if "!Search:~%Length%,1!" == "" goto ReplaceLoop
set /A Length+=1
goto GetLength
:ReplaceLoop
if "!VarValue:~0,%Length%!" == "!Search!" (
set "NewValue=!NewValue!!Replace!"
set "VarValue=!VarValue:~%Length%!"
) else (
set "NewValue=!NewValue!!VarValue:~0,1!"
set "VarValue=!VarValue:~1!"
)
if not "!VarValue!" == "" goto ReplaceLoop
endlocal & set "%VarName%=%NewValue%" & exit /B