anchor.diff:  %RETURN%
   
   :#----------------------------------------------------------------------------#
  +:#                                                                            #
  +:#  Function        GetRegistryValue					      #
  +:#                                                                            #
  +:#  Description     Get a registry value content.                             #
  +:#                                                                            #
  +:#  Arguments       KEY NAME [VALUEVAR [TYPEVAR]]			      #
  +:#                                                                            #
  +:#  Notes 	                                                              #
  +:#                                                                            #
  +:#  History                                                                   #
  +:#   2014-06-23 JFL Renamed GetValue as GetRegistryValue.                     #
  +:#                  Fixed the default (nameless) value reading.               #
  +:#                  Don't display errors, but return 1 if value not found.    #
  +:#   2021-03-03 JFL Don't output error messages, and return an exit code.     #
  +:#                                                                            #
  +:#----------------------------------------------------------------------------#
   
   :# Get a registry value content. Args: KEY NAME [VALUEVAR [TYPEVAR]]
  -:GetValue
  +:GetRegistryValue
   %FUNCTION% enableextensions enabledelayedexpansion
  -set "KEY="
  -set "NAME="
  -set "VALUEVAR="
  -set "TYPEVAR="
  -:get_value_args
  -if "%~1"=="" goto got_value_args
  -if not defined KEY set "KEY=%~1" & shift & goto get_value_args
  -if not defined NAME set "NAME=%~1" & shift & goto get_value_args
  -if not defined VALUEVAR set "VALUEVAR=%~1" & shift & goto get_value_args
  -if not defined TYPEVAR set "TYPEVAR=%~1" & shift & goto get_value_args
  -:got_value_args
  +set "KEY=%~1"
  +set "NAME=%~2"
  +set "VALUEVAR=%~3"
  +set "TYPEVAR=%~4"
   if not defined VALUEVAR set "VALUEVAR=VALUE"
   set "%VALUEVAR%="
   :# Returning the type is optional. Do not define a default for TYPEVAR.
  
positive.code: set "EXEC.ARGS=%EXEC.ARGS: -v=%"
  set "EXEC.ARGS=%EXEC.ARGS:~1%"
  :# Optimization to speed things up in non-verbose mode
  if not defined LOGFILE set "ECHO.V=rem"
  if .%LOGFILE%.==.NUL. set "ECHO.V=rem"
  if not defined LOGFILE set "ECHOVARS.V=rem"
  if .%LOGFILE%.==.NUL. set "ECHOVARS.V=rem"
  goto :eof
  
  :Verbose.On
  
negative.code: :GetFullPathName
  :CanonicName NAME VAR	:# Return the canonic absolute pathname for (maybe relative) NAME
  set "%~2=%~f1"
  exit /b
  
  :#----------------------------------------------------------------------------#
  
  :# Convert a short or long pathname to a full long pathname
  :GetLongPathname %1=PATHNAME %2=Output variable name
  setlocal EnableDelayedExpansion
  set "FULL_SHORT=%~fs1"           &:# Make sure it really is short all the way through
  set "FULL_SHORT=%FULL_SHORT:~3%" &:# Remove the drive and initial \
  set "FULL_LONG=%~d1"             &:# Begin with just the drive
  if defined FULL_SHORT for %%x in ("!FULL_SHORT:\=" "!") do ( :# Loop on all short components
    set "ATTRIB_OUTPUT=" &:# If the file does not exist, filter-out attrib.exe error message on stdout, with its - before the drive.
    for /f "delims=" %%l in ('attrib "!FULL_LONG!\%%~x" 2^>NUL ^| findstr /v /c:" - %~d1"') do set "ATTRIB_OUTPUT=%%l"
    if defined ATTRIB_OUTPUT ( :# Extract the long name from the attrib.exe output
      for %%f in ("!ATTRIB_OUTPUT:*\=\!") do set "LONG_NAME=%%~nxf"
    ) else (                   :# Use the short name (which does not exist)
      set "LONG_NAME=%%~x"
    )
    set "FULL_LONG=!FULL_LONG!\!LONG_NAME!"
  ) else set "FULL_LONG=%~d1\"
  endlocal & if not "%~2"=="" (set "%~2=%FULL_LONG%") else echo %FULL_LONG%
  exit /b
  
  :#----------------------------------------------------------------------------#
  