anchor.diff:  %RETURN%
   
   :#----------------------------------------------------------------------------#
  +:# Test passing tricky characters
  +
  +:testC
  +%FUNCTION% EnableDelayedExpansion
  +:# set "STRING=@(())^^^^,,;;  %%%%^!^!**??[[]]==~~''""%%CD%%_^!CD^!"
  +:# set STRING=!STRING!"@||&&(())<<>>^^,,;;  %%%%^!^!**??[[]]==~~''%%CD%%_^!CD^!"
  +set "STRING0=@||&&(())<<>>^^^^,,;;  %%%%^!^!**??[[]]==~~''%%CD%%_^!CD^!"
  +set "STRING1=@(()),,;;  %%%%^!^!**??[[]]==~~''""%%CD%%_^!CD^!" &:# Remove ||&&^^<<>> that cause problems when not quoted
  +set STRING=!STRING1! "!STRING0!"
  +set STRING
  +call :testC2 !STRING:%%=%%%%!
  +%RETURN%
  +
  +:testC2
  +%DOECHO% setlocal DisableDelayedExpansion
  +set ARGLINE=%*
  +set ARGLINE
  +set ARG#1=%1
  +set ARG#2=%2
  +set ARG#3=%3
  +set ARG#4=%4
  +set ARG#
  +
  +%ECHO% :# Idem with initial ^^caret
  +set ^"ARGLINE=%*^"
  +set ARGLINE
  +set ^"ARG#1=%1^" &:# yes
  +set ^"ARG#2=%2^" & echo {%ARG#1%}
  +set ^"ARG#3=%3^" & echo {%ARG#2%}
  +set ^"ARG#4=%4^"
  +set ARG#
  +
  +endlocal
  +
  +%DOECHO% setlocal EnableDelayedExpansion
  +set ^"ARGLINE=%*^"
  +set ARGLINE
  +set ARG#1=%1
  +set ARG#2=%2
  +set ARG#3=%3
  +set ARG#4=%4
  +set ARG#
  +endlocal
  +
  +%FUNCTION% EnableDelayedExpansion
  +set ARGS
  +set "STRING0="
  +set "STRING1="
  +set "STRING=!ARGS!"
  +set STRING
  +%DOECHO% setlocal DisableDelayedExpansion
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +endlocal
  +
  +%DOECHO% setlocal EnableDelayedExpansion
  +set ARGS=!STRING!
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +%POPARG%
  +%ECHOVARS% ARG ^""ARG"^"
  +endlocal
  +%RETURN%
  +
  +:# Test preparing tricky arguments for expansion
  +:testP
  +%FUNCTION% EnableDelayedExpansion
  +:# set "STRING=@(())^^^^,,;;  %%%%^!^!**??[[]]==~~''""%%CD%%_^!CD^!"
  +:# set STRING=!STRING!"@||&&(())<<>>^^,,;;  %%%%^!^!**??[[]]==~~''%%CD%%_^!CD^!"
  +set "STRING0=@||&&(())<<>>^^^^,,;;  %%%%^!^!**??[[]]==~~''%%CD%%_^!CD^!"
  +set "STRING1=@(()),,;;  %%%%^!^!**??[[]]==~~''""%%CD%%_^!CD^!" &:# Remove ||&&^^<<>> that cause problems when not quoted
  +set STRING=!STRING1! "!STRING0!"
  +set STRING
  +setlocal DisableDelayedExpansion
  +call :Prep2ExpandVars STRING
  +endlocal
  +%RETURN%
  +
  +:#----------------------------------------------------------------------------#
  +:# Test relative performances of two possible ways to do indirect variable expansion
  +
  +:call_set
  +call set "X=%%windir%%"
  +goto :eof
  +
  +:call_:set
  +call :set "X=%%windir%%"
  +goto :eof
  +
  +:set
  +set %*
  +goto :eof
  +
  +:#----------------------------------------------------------------------------#
   :#                                                                            #
   :#  Function        Main                                                      #
   :#                                                                            #
  
positive.code: :#                  See "cmd /?" for information about characters needing to  #
  :#                  be quoted.                                                #
  :#                  I've added "@" that needs quoting if first char in cmd.   #
  :#                  I've removed "!" as quoting does NOT prevent expansions.  #
  :#                                                                            #
  :#  History                                                                   #
  :#   2010-12-19 JFL Created this routine                                      #
  :#   2011-12-12 JFL Rewrote using findstr. (Executes much faster.)	      #
  :#		    Added support for empty pathnames.                        #
  :#                                                                            #
  :#----------------------------------------------------------------------------#
  
  :# Quote file pathnames that require it. %1=Input variable. %2=Opt. output variable.
  :condquote
  %FUNCTION% enableextensions enabledelayedexpansion
  set RETVAR=%~2
  if "%RETVAR%"=="" set RETVAR=%~1
  set "P=!%~1!"
  :# If the value is empty, don't go any further.
  if not defined P set "P=""" & goto :condquote_ret
  :# Remove double quotes inside P. (Fails if P is empty)
  set "P=%P:"=%"
  :# If the value is empty, don't go any further.
  if not defined P set "P=""" & goto :condquote_ret
  :# Look for any special character that needs quoting
  echo."%P%"|findstr /C:" " /C:"&" /C:"(" /C:")" /C:"@" /C:"," /C:";" /C:"[" /C:"]" /C:"{" /C:"}" /C:"=" /C:"'" /C:"+" /C:"`" /C:"~" >NUL
  if not errorlevel 1 set P="%P%"
  :condquote_ret
  %UPVAR% %RETVAR%
  %RETURN%
  
  :condquote2
  
negative.code: set "FUNCTION0=call call :Debug.Entry0 %%0 %%*"
  set FUNCTION=%MACRO.GETEXP% %&% %MACRO% ( %\n%
    call set "FUNCTION.NAME=%%0" %\n%
    call set ARGS=%%*%# Do not quote this, to keep string/non string aternance #%%\n%
    set ARGS=%!%ARGS:^^^^^^^^^^^^^^^^=^^^^^^^^%!%%# ^carets are doubled in quoted strings, halved outside. => Quadruple them if using unquoted ones #%%\n%
    if %!%DEBUG%!%==1 ( %# Build the debug message and display it #% %\n%
      if defined ^^%>%DEBUGOUT ( %# If we use a debugging stream distinct from stdout #% %\n%
        call :Echo.2DebugOut call %!%FUNCTION.NAME%!% %!%ARGS:%%=%%%%%!%%# Use a helper routine, as delayed redirection does not work #%%\n%
      ) else ( %# Output directly here, which is faster #% %\n%
        echo%!%INDENT%!% call %!%FUNCTION.NAME%!% %!%ARGS%!%%\n%
      ) %\n%
      if defined LOGFILE ( %# If we have to send a copy to a log file #% %\n%
        call :Echo.2LogFile call %!%FUNCTION.NAME%!% %!%ARGS:%%=%%%%%!%%# Use a helper routine, as delayed redirection does not work #%%\n%
      ) %\n%
      call set "INDENT=%'!%INDENT%'!%  " %\n%
    ) %\n%
  