Я предполагаю, что ваши команды set
все живут в скобках кода (например, цикл for
), и вы не используете отложенное расширение, когда вы должны быть. Если это так, то вы, вероятно, можете исправить существующий код таким образом:
setlocal enabledelayedexpansion
set "rest2=!t1!"
set "t1=!t3!"
set "t3=!rest2!"
Просто так я чувствую, что я сделал что-то, вот функция полезности, будет изменить строку, которая может решить вашу проблему , У этого есть предел в 100 символов ради небольшого времени выполнения. Я предполагаю, что это будет хорошо для большинства ситуаций.
@echo off
setlocal
set /P "input=Input? "
call :reverse flipped "%input%"
echo %input% reversed is %flipped%
rem // end main runtime
goto :EOF
rem // functions
:reverse <return_var> <string>
setlocal enabledelayedexpansion
set "ret=" & set "str=%~2"
for /L %%I in (0,1,100) do (
if "!str!"=="" for %%a in ("!ret!") do (
endlocal & set "%~1=%%~a" & exit /b
)
set "ret=!str:~0,1!!ret!"
set "str=!str:~1!"
)
Если вы хотели бы иметь функцию работать до предела символов переменной может нести, вы можете увеличить 100 до 8192, но это будет вызывать цикл for /L
в цикле 8192 раз независимо от того, нарушен ли он на exit /b
. На самом деле нет изящного способа вырваться из for /L
(хотя он намного быстрее, чем цикл goto
).
Добавление функции для получения длины строки перед запуском цикла for /L
может сделать ваш код более эффективным для длинных строк, не оказывая значительного влияния на короткие. Хотя это намного больше кода, он быстрее, чем сценарий выше.
@echo off
setlocal
set /P "input=Input? "
call :reverse flipped "%input%"
echo %input% reversed is %flipped%
goto :EOF
:reverse <return_var> <string>
setlocal enabledelayedexpansion
set "ret=" & set "str=%~2" & call :length len "%~2"
for /L %%I in (0,1,%len%) do (
if "!str!"=="" for %%a in ("!ret!") do (
endlocal & set "%~1=%%~a" & exit /b
)
set "ret=!str:~0,1!!ret!"
set "str=!str:~1!"
)
:length <return_var> <string>
setlocal enabledelayedexpansion
if "%~2"=="" (set ret=0) else set ret=1
set "tmpstr=%~2"
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if not "!tmpstr:~%%I,1!"=="" (
set /a ret += %%I
set "tmpstr=!tmpstr:~%%I!"
)
)
endlocal & set "%~1=%ret%"
exit /b 0
Когда goto :EOF
или exit /b
встречается в пределах for /L
цикла, подсчет продолжается, хотя после того, как материал do
игнорируется.
Большое вам спасибо за помощь: D теперь он отлично работает :) –