2013-04-08 4 views
0

Я пытаюсь читать символы строки внутри цикла for.Невозможно прочитать символы строки внутри цикла for

Команда! String: ~ 1,3! работает отлично. Но могу ли я сделать это с помощью переменных вместо 1 и 3. Я попробовал следующий код, но я не знаю, что не так. Это не работает.

@echo off 
setlocal enableextensions enabledelayedexpansion 
set string=abcdefghij 
set /a count=1 
for /l %%x in (1,1,3) do (
    set string2=!string:~%count%,1! 
    set /a count+=1 
    echo !string2! 
    pause 
) 

, но он всегда дает выход как:

b 

Я хочу, чтобы выходной быть как:

b 
c 
d 

Просьба помочь в решении этого .. Большое спасибо заранее

+0

Если вы задаете вопрос и не получаете большого внимания, не спрашивайте его снова. (Dupe от того же пользователя): http://stackoverflow.com/questions/15743077/how-to-read-characters-from-a-string-inside-a-for-loop-in-a-batch-file –

ответ

0

Проблема заключается в том, что расширение %count% не задерживается, поэтому оно имеет одинаковое значение для каждого итерации цикла. Это лучше написано так:

@echo off 
setlocal enableextensions enabledelayedexpansion 
set string=abcdefghij 
set /a count=1 
for /l %%x in (%count%,1,3) do (
    set string2=!string:~%%x,1! 
    echo !string2! 
) 

Редактировать

Если вы хотите сохранить %count% оцениваются как переменная установлена, а не только в начале цикла for используйте Aacini's answer.

+0

Но есть ли способ увеличить% count%? Можно ли это сделать? Пожалуйста, объясните –

+0

@ RaathanaRanganath - см. Ответ Аасини. – rojo

1

Для того, чтобы достичь того, чего вы хотите, вы должны сделать Delayed Expansion дважды, то есть, что-то вроде этого:

set string2=!string:~!count!,1! 

Конечно, предыдущая строка является недействительным. Хотя есть несколько способов решить эту проблему, большинство из них используют команду call, которая работает медленно. Чтобы исправить эту проблему, чтобы она выполнялась самым быстрым способом, используйте команду for, чтобы изменить первый! расширение в переменный параметр FOR, а затем использовать его в исходном выражении:

for %%i in (!count!) do set string2=!string:~%%i,1! 
+0

+1 Мне это нравится. Это чище, чем 'call'. Вы правы в отношении разницы во времени между вашим методом и «вызовом». Я просто выполнил тестовый скрипт с 1 до 1000, используя либо 'for', как у вас, либо' call', как и я, чтобы установить '% count%'. Метод 'for' занял 331 мс. Метод 'call' занял 1.195 секунд. – rojo

+0

@Aaicini, спасибо большое :) –

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