Показать полную графическую версию : [решено] Как работать с переменной внутри цикла FOR?
alex_past
29-09-2010, 22:04
Подскажите, пожалуйста. Не могу понять, что происходит.
Мне нужно, чтобы при каждой итерации в цикле for (кусок кода ниже) переменная j увеличивалась на 1. Но даже присваивание ей не работает: на каждом шаге получаю "before: 1, after: 1". Что я делаю не так?
SET j=1
FOR /F %%a in ('dir /b .\*.jpg') do (
@echo before %j%
@SET /a j = %j% + 1
@echo after %j%
REM тут вырезано все, что не относилось к этой ошибке
)
Переменные в цикле заключите в восклицательные знаки (!) вместо знаков процента (%), а в начало скрипта добавьте Setlocal EnableDelayedExpansion
Примерно так:Setlocal EnableDelayedExpansion
SET j=1
FOR /F %%a in ('dir /b .\*.jpg') do (
@echo before !j!
@SET /a j = j + 1
@echo after !j!
REM тут вырезано все, что не относилось к этой ошибке
)
kiripanda
29-09-2010, 22:17
Или без EnableDelayedExpansion так:
@echo off
SET j=1
FOR /F %%a in ('dir /b .\*.jpg') do call :cnt "%%a"
goto :eof
:cnt
echo before %j%
SET /a j = j + 1
echo after %j%
REM тут вырезано все, что не относилось к этой ошибке
)
goto :eof
alex_past
29-09-2010, 22:28
Большое спасибо!
И то, и другое сработало.
dimitrioglo
13-06-2013, 10:36
Товарищи знатоки, устал пытаться реализовать такую штуку, что бы указанный логин разбирался по буквам в цикле
мне надо из admin получить
a
d
m
i
n
если сделать так
set login=admin
setlocal enabledelayedexpansion
SET j=0
for /L %%i in (1,1,5) do (
ping -n 1 -w 200 192.168.254.254 >nul
SET /a j=j+1
@echo after !j!
echo !login:~0,%%i!
)
endlocal
то получаю
a
ad
adm
admi
admin
что собственно и логично...
А вот что бы получить что мне надо по идее надо бы засунуть переменную j в переменную login тобиш вот так
echo !login:~!j!,%%i!
вот тут то и загвоздка... Очень прошу помочь. Заранее спасибо.
dimitrioglo, что бы указанный логин разбирался по буквам в цикле »
@Echo Off
Setlocal EnableDelayedExpansion
Set login=admin
For /L %%i In (0,1,4) Do (
Ping -n 1 -w 200 192.168.254.254 >nul
Echo !login:~%%i,1!
)
Endlocal
Pause>nul
@Echo Off
Set login=admin
For /L %%i In (0,1,4) Do (
Ping -n 1 -w 200 192.168.254.254 >nul
Call Echo %%login:~%%i,1%%
)
Pause>nul
dimitrioglo
13-06-2013, 11:25
Спасибо огромное.!
Мне где то даже стыдно)) решение очень красивое, чето я стормозил)))
dimitrioglo
13-06-2013, 18:40
Не плохо продвинулся в своей задаче, но опять ступор... прошу отозваться всех кто знает...
как бы мне проверять в каком регистре получет переменная символы, например:
если "символ" в верхнем регистре сделать то и то...
если в нижнем - другое
не нашел стандартной команды в CMD
Foreigner
13-06-2013, 19:57
dimitrioglo:
если "символ" в верхнем регистре сделать то и то... »
Например (без сторонних утилит):
@echo off
setlocal
set "var=a"
for /f "tokens=2 delims=:" %%i in (' "2>&1 find "" %var%" ') do (
if " %var%"=="%%i" (echo %var% is UPPERCASE) else (echo %var% is lowercase)
)
dimitrioglo
14-06-2013, 14:46
set "var=a"
for /f "tokens=2 delims=:" %%i in (' "2>&1 find "" %var%" ') do (
if " %var%"=="%%i" (echo %var% is UPPERCASE) else (echo %var% is lowercase)
) »
К сожалению такая конструкция не работает... она вообще ничего не выводит... стало быть что то в строке с for
Foreigner
14-06-2013, 18:22
К сожалению такая конструкция не работает... »
> type 1.cmd
@echo off
setlocal
set "var=A"
for /f "tokens=2 delims=:" %%i in (' "2>&1 find "" %var%" ') do (
if " %var%"=="%%i" (echo %var% is UPPERCASE) else (echo %var% is lowercase)
)
> 1
A is UPPERCASE
УМВР
dimitrioglo
14-06-2013, 18:34
Может кому то пригодится как проверить символ в верхнем регистре или нет, я добился вот таким образом:
@echo off
setlocal
set "var=A"
for /f "tokens=1,2* delims=:" %%a in ('find "" "%var%" 2^>^&1') do set String=%%a
echo %var%
echo %String:~-1,1%
if %var% EQU %String:~-1,1% echo 1
if %var% NEQ %String:~-1,1% echo 2
pause
if %var% EQU %String:~-1,1% echo 1
if %var% NEQ %String:~-1,1% echo 2
«else» уже не в моде?
dimitrioglo
17-06-2013, 12:03
«else» уже не в моде? »
у меня 2 разных условия, приведенный код лишь пример...
А теперь по сути...
Люди добрые )) помогите...
у меня конструкция
for /f "tokens=1-3 skip=1 delims=/-:., " %%a in (conf.txt) do (
set value=%%b
)
из документа со следующим содержанием
log1 admin
pass1 admin
log2 tse
passw2 sQOsS97Zj7
всегда выводит sQOsS97Zj7 не зависимо от указанного skip=1, skip=2 или skip=3...
В чем косяк..?
В чем косяк..? »
В том, что строка
set value=%%b
выполняется несколько раз и всегда будет "вытаскивать" последнее значение из цикла.
skip меняет начальное значение цикла, но на последнее значение он ни какого влияния не оказывает (если конечно не превышает число строк в файле).
dimitrioglo
17-06-2013, 13:27
выполняется несколько раз и всегда будет "вытаскивать" последнее значение из цикла. »
Да, убедился что именно так... но как же тогда ему указать нужную строку..?
Попробуйте так:
for /f "tokens=1-3 skip=1 delims=/-:., " %%a in (conf.txt) do (
set value=%%b& GoTo _end
)
:_end
dimitrioglo
17-06-2013, 16:35
for /f "tokens=1-3 skip=1 delims=/-:., " %%a in (conf.txt) do (
set value=%%b& GoTo _end
)
:_end »
спасибо - подходящее решение.
Но я, как обычно, с новым вопросом...
почему в следующей схеме
for /L %%j in (%starting%,1,%ending%) do (
for /f "tokens=1-3 skip=%%j delims=/-:., " %%a in (conf.ini) do (
set value=%%b & goto fin
)
:fin
ping -n 1 -w 5000 192.168.254.254 >nul
echo %value%
)
переменную %%j из (skip=%%j) видит как %j а не как значение переменной... неужели я много прошу...
setlocal enableextensions enabledelayedexpansion
for /L %%j in (%starting%,1,%ending%) do (
for /f "tokens=1-3 skip=%%j delims=/-:., " %%a in (conf.ini) do (
set value=%%b & goto fin
)
:fin
ping -n 1 -w 5000 192.168.254.254 >nul
echo !value!
)
endlocal
dimitrioglo
17-06-2013, 19:14
setlocal enableextensions enabledelayedexpansion
for /L %%j in (%starting%,1,%ending%) do (
for /f "tokens=1-3 skip=%%j delims=/-:., " %%a in (conf.ini) do (
set value=%%b & goto fin
)
:fin
ping -n 1 -w 5000 192.168.254.254 >nul
echo !value!
)
endlocal »
к сожалению не помогло... ситуация осталась той же
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.