2015-05-09 3 views
1

У меня есть три строки t1=3, t2=1 и t3=5.как обратить строки в пакетном файле

хочу обратить вспять эти строки так, чтобы t1=5, t2=1 и t3=3.

Вместе они образуют число (ввод: 315 и вывод: 513).

Мне нужно изменить число, которое они образуют.

Я пытался сделать это:

set "rest2=%t1%" 
set "t1=%t3%" 
set "t3=%rest2%" 

, когда я попробовал, она была удалена t1 из числа они образовывали (ввод: 315 и выход: 13).

Я не знаю, почему это произошло.

ответ

0

Я предполагаю, что ваши команды 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 игнорируется.

+0

Большое вам спасибо за помощь: D теперь он отлично работает :) –

2

Извините. Существует нет способа что ваш код производит 13 как выход. Если код внутри скобок, то переменная rest2 не определена, поэтому переменная удаляемого t3 и, следовательно, выход должен быть 51. Вы можете проверить эту точку в следующем коде:

@echo off 
setlocal 

set t1=3 
set t2=1 
set t3=5 

echo %t1%%t2%%t3% 

(
set "rest2=%t1%" 
set "t1=%t3%" 
set "t3=%rest2%" 
) 

echo %t1%%t2%%t3% 

Я предлагаю вам внимательно просмотрите свой код, ища ошибки в других частях.

Если проблема в том, что код находится в круглых скобках, способ исправить это через Delayed Expansion, как объяснил Ройо в своем ответе. Однако, если код в скобках не, то вы должны знать, что вы можете достичь обмена t1 и t3whitout используя rest2 вспомогательную переменную до тех пор, как вы поместите оба назначения в одной и той же линии:

set "t1=%t3%" & set "t3=%t1%" 

Это работает, потому что переменные, заключенные в процентах, заменяются их значениями до.

+0

Вы полезны. :) – rojo

+0

thx, который также отлично работал: D –

Смежные вопросы