Вы, кажется, очень смущены последовательностью операций, которые происходят, когда было вызвано отложенное расширение.
Сначала значение var
заменяется на %var%
.
Тогда! Вар!
Область действия этой последовательности операций представляет собой одну логическую строку, которая может быть одной физической строкой или любойчисло физических строк, продолженных с терминала ^
или чаще с использованием последовательности строк в скобках.
В вашей основной строке тогда
CALL :get_substring string substringLength substring
ECHO !string!
ECHO !substring!
ENDLOCAL & SET %1=%string% & SET %3=%substring% & EXIT /B 0
Так как эти операторы не в той же логической строке, они будут индивидуально оценены, поэтому !var!
== %var%
.
в вашей подпрограмме (не-IF версия),
SET substring=!string:~0,%substringLength%!
ECHO !substring!
SET /A cutSpaceCount=!substringLength!+1
SET string=!string:~%cutSpaceCount%!
ECHO !string!
снова являются отдельными утверждениями.Первый set
сначала заменит substringlength
, а затем выполнит SET substring=!string:~0,5!
в качестве второй операции.
Каждый из echo
является автономным оператором, и !
может(и, желательно, следует) заменить на %
.
. set /a
- хорошо, set /a
позволяет использовать значение current для переменной без декорации, поэтому SET /A cutSpaceCount=substringLength+1
или SET /A cutSpaceCount=%substringLength%+1
может использоваться здесь без логического эффекта.
ENDLOCAL & SET %1=%string% & SET %3=%substring% & EXIT /B 0
будет оцениваться в соответствии со значениями, установленными предыдущей кодовой последовательностью.
Однако когда вы добавляете if
, код заключен в скобки и, таким образом, становится одним логическим утверждением и действует по-другому.
echo
es, тогда требуют !
, потому что вы хотите отобразить измененные значения в кодовом блоке .Поскольку cutSpaceCount
не установлен в начале кодового блока, SET string=!string:~%cutSpaceCount%!
будет оцениваться как SET string=!string:~!
, а затем ENDLOCAL & SET %1=%string% & SET %3=%substring% & EXIT /B 0
должным образом подставит значения переменных , поскольку онипростояла, когда IF
была обнаружена
Итак, процедура замены может быть
:get_substring
SETLOCAL ENABLEDELAYEDEXPANSION
SET "string=!%~1!"
SET "substringLength=!%2!"
SET "substring=!string:~0,%substringLength%!"
SET "string=!string:~%substringLength%!"
IF "%string:~0,1%"==" " SET "string=%string:~1%"
ENDLOCAL & SET "%1=%string%" & SET "%3=%substring%"
EXIT /B 0