вам нужно два слоя переменного расширения.Это можно сделать с помощью отложенное расширение или call
:
@echo off
setlocal enabledelayedexpansion
set "string=ABCDEFGH"
set "start=2"
set "len=3"
echo A with delayed expansion: !string:~%start%,%len%!
call echo A with using 'call': %%string:~%start%,%len%%%
FOR /F %%G IN ('dir /b "%~f0"') DO (
set /A "newStart=!Start!+2"
call echo B with 'call' and delayed : %%string:~!newStart!,!len!%%
call call echo B with double-'call': %%%%string:~%%newStart%%,%len%%%%%
)
FOR /F %%G IN ('dir /b "%~f0"') DO call :output
goto :eof
:output
set /A "newStart=Start+2"
echo C with subroutine and delayed expansion: !string:~%newStart%,%len%!
call echo C with subroutine andusing 'call': %%string:~%newStart%,%len%%%
goto :eof
EDITED в соответствии с вашим комментарием.Вам нужен третий уровень расширения.Я расширил код несколькими различными методами.
(кстати: пожалуйста, не оставляйте код в комментариях, его почти невозможно прочитать. А если ваш вопрос изменится, лучше задайте следующий вопрос в следующий раз)