|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как работать с переменной внутри цикла FOR? |
|
|
CMD/BAT - [решено] Как работать с переменной внутри цикла FOR?
|
Новый участник Сообщения: 2 |
Подскажите, пожалуйста. Не могу понять, что происходит.
Мне нужно, чтобы при каждой итерации в цикле for (кусок кода ниже) переменная j увеличивалась на 1. Но даже присваивание ей не работает: на каждом шаге получаю "before: 1, after: 1". Что я делаю не так? |
|
Отправлено: 22:04, 29-09-2010 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата dimitrioglo:
|
|
Отправлено: 20:17, 17-06-2013 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 11
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
@echo off setlocal title Telnet connect cls echo edit by DDI echo. set /p ip=enter router IP: echo. :start echo 1 - simple user echo 2 - super user echo. set /p lvl=enter access level: echo. if %lvl% NEQ 1 ( if %lvl% NEQ 2 goto start ) if %lvl% EQU 1 set "starting=1" & set "ending=3" if %lvl% EQU 2 set "starting=5" & set "ending=7" 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 set nr=15 echo %value% start telnet %ip% setlocal enabledelayedexpansion for /L %%i in (0,1,%nr%) do ( if "!value:~%%i,1!"=="" goto end for /f "tokens=1,2* delims=:" %%a in ('find "" "!value:~%%i,1!" 2^>^&1') do set String=%%a if "!value:~%%i,1!" EQU "!String:~-1,1!" ( ping -n 1 -w 300 192.168.254.254 >nul nircmd.exe sendkeypress capslock nircmd.exe sendkey !value:~%%i,1! press > telnet %ip% nircmd.exe sendkeypress capslock) if "!value:~%%i,1!" NEQ "!String:~-1,1!" ( ping -n 1 -w 300 192.168.254.254 >nul nircmd.exe sendkey !value:~%%i,1! press > telnet %ip%) ) :end endlocal ping -n 1 -w 300 192.168.254.254 >nul nircmd.exe sendkey enter press > telnet %ip% ) DEL telnet endlocal |
|
Отправлено: 10:07, 18-06-2013 | #22 |
Новый участник Сообщения: 11
|
Профиль | Сайт | Отправить PM | Цитировать Все, решил свою задачу, остановился на обыном методе goto что выглядит в конечном итоге так:
@echo off setlocal title Telnet connect cls echo edit by DDI echo. set /p ip=enter router IP: echo. :start echo 1 - simple user echo 2 - super user echo. set /p lvl=enter access level: echo. if %lvl% NEQ 1 ( if %lvl% NEQ 2 goto start ) if %lvl% EQU 1 set /a "starting=1" & set /a "ending=3" if %lvl% EQU 2 set /a "starting=5" & set /a "ending=7" start telnet %ip% :repeat for /F "tokens=1-3 skip=%starting% delims=/-:., " %%a in (conf.ini) do ( set value=%%b & goto fin ) :fin set /a starting+=1 set nr=15 setlocal enabledelayedexpansion for /L %%i in (0,1,%nr%) do ( if "!value:~%%i,1!"=="" goto end for /f "tokens=1,2* delims=:" %%a in ('find "" "!value:~%%i,1!" 2^>^&1') do set String=%%a if "!value:~%%i,1!" EQU "!String:~-1,1!" ( :: ping -n 1 -w 10 192.168.254.254 >nul nircmd.exe sendkeypress capslock nircmd.exe sendkey !value:~%%i,1! press > telnet %ip% nircmd.exe sendkeypress capslock) if "!value:~%%i,1!" NEQ "!String:~-1,1!" ( :: ping -n 1 -w 10 192.168.254.254 >nul nircmd.exe sendkey !value:~%%i,1! press > telnet %ip%) ) :end endlocal ping -n 1 -w 50 192.168.254.254 >nul nircmd.exe sendkey enter press > telnet %ip% if %starting% NEQ %ending% goto repeat DEL telnet endlocal |
Отправлено: 18:17, 18-06-2013 | #23 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Подскажите, где ошибся...
есть папка с файлами html - в них таблицы мне надо обработать все файлы html в папке и создать одноименные csv для одного файла все работает, а для папки чето запутался Setlocal EnableDelayedExpansion for /f %%i in ('dir /b *.html') do ( set n=0 set sum=3 set out=%%~ni.csv echo Число мес;Час;номер>> %out% echo месяц;; дог.222>> %out% echo ;;адрес>> %out% for /f "eol= skip=31 tokens=1,2,3,4* delims=<> " %%j in (%%~nxi) do call :remap %%j %%l %out% echo Сумма;;=СУММ(C4:C%sum%)>> %out% if errorlevel==0 set err=[OK] else set err=[error] echo %%~nxi - %err% ) pause :remap if "%1"=="TR" set n=1 if "%1"=="TD" ( set /a n+=1 if %n%==2 set s3=%2 set ss3=%s3:.=,% if %n%==6 set s2=%2 if %n%==7 ( echo %2;%s2%;%ss3%>> %3 set /a sum+=1 ) ) exit /b рабочий вариант для одного файла:
echo Число мес;Час;номер>> 1.csv echo месяц;; дог.номер>> 1.csv echo ;;адрес>> 1.csv set n=0 set sum=3 for /f "eol= skip=31 tokens=1,2,3,4* delims=<> " %%i in (file.html) do call :remap %%i %%k echo Сумма;;=СУММ(C4:C%sum%)>> 1.csv goto :EOF :remap if "%1"=="TR" set n=1 if "%1"=="TD" ( set /a n+=1 if %n%==2 set s3=%2 set ss3=%s3:.=,% if %n%==6 set s2=%2 if %n%==7 ( echo %2;%s2%;%ss3%>> 1.csv set /a sum+=1 ) ) exit /b файл html во вложении - Файл 152815 |
Последний раз редактировалось kvant-07, 01-06-2018 в 10:41. Отправлено: 10:31, 01-06-2018 | #24 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать kvant-07,
Я не проверял работу Вашего кода (рабочий вариант для одного файла), я тупо оформил его в виде процедуры и поместил её вызов внутрь цикла по всем html-файлам текущей папки. Те изменения Вашего кода, которые я счел необходимым сделать, я выделил
@Echo Off FOR %%f IN (*.html) DO Call :OneFile "%%f" GoTo :Eof :OneFile Set "CSV=%~1.csv" echo Число мес;Час;номер>> "%CSV%" echo месяц;; дог.номер>> "%CSV%" echo ;;адрес>> "%CSV%" set /A n=0 set /A sum=3 for /f "usebackq eol= skip=31 tokens=1,2,3,4* delims=<> " %%i in ("%1") do call :remap %%i %%k echo Сумма;;=СУММ(C4:C%sum%)>> "%CSV%" goto :EOF :remap if "%1"=="TR" set n=1 if "%1"=="TD" ( set /a n+=1 if %n%==2 set s3=%2 set ss3=%s3:.=,% if %n%==6 set s2=%2 if %n%==7 ( echo %2;%s2%;%ss3%>> "%CSV%" set /a sum+=1 ) ) exit /b У меня такое ощущение, что это промежуточная работа и Вам в ответе надо получить Excel-файлы. ИМХО, разумнее нарисовать VBS-скрипт, который сразу из исходных файлов получит данные в Excel-таблицах. Хотел из любопытства скачать Ваш файл - что-то не получилось. Может, его переименовать надо, например с расширением .txt либо упаковать? |
------- Последний раз редактировалось megaloman, 01-06-2018 в 15:16. Отправлено: 14:58, 01-06-2018 | #25 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата kvant-07:
внутри оператора скобок, динамически изменяемые переменные, внутри тех же скобок, необходимо раскрывать с помощью отложенного расширения. Т.о. у Вас нерабочий код в обоих случаях... во втором случае, это проявится при условии истинности if "%1"=="TD" А вообще, вот наглядный пример: |
|
------- Последний раз редактировалось YuS_2, 01-06-2018 в 15:22. Отправлено: 15:16, 01-06-2018 | #26 |
Ветеран Сообщения: 2767
|
Профиль | Отправить PM | Цитировать какой-то странный глюк с циклом.
беру примитивную задачу: Set BCP=HKU Set FTMP=%~n0-1.bat for /f "skip=1 delims=" %%G in ('reg query %BCP%') DO ( set FTMP=%%G.tmp echo regedit 4 >%FTMP% echo HKU\%%G\Software\Microsoft\Windows\CurrentVersion\Explorer >>%FTMP% ) На этом цикл прекращается. Что ему мешает исполняться для всех из списка? Попробовал просто в комстроке еще более простое - получил почему меняется порядок? Почему 18 перепрыгивает вниз? |
------- Отправлено: 10:21, 04-09-2018 | #27 |
Сообщения: 53488
|
Профиль | Отправить PM | Цитировать |
Отправлено: 11:37, 04-09-2018 | #28 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Если не использовать SetLocal EnableDelayedExpansion для связывания времени выполнения
Цитата bredych:
Вы в цикле получили строки типа HKEY_USERS\S-1-5-19. Файл с именем HKEY_USERS\S-1-5-19.tmp создать нельзя, даже если переменная !FTMP! будет правильно раскрываться, если в текущей папке отсутствует подпапка HKEY_USERS В Вашем случае Вы определили FTMP=%~n0-1.bat до цикла. В цикле переменная не раскрывается с новым значением (для отладки поставьте Echo %FTMP% - увидите (исходный)-1.bat). То есть, в цикле Вы пересоздаёте один и тот же (исходный)-1.bat файл. После цикла предсказуемо получите содержимое для последней строки. Цитата bredych:
|
||
------- Последний раз редактировалось megaloman, 04-09-2018 в 13:21. Отправлено: 11:51, 04-09-2018 | #29 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата bredych:
|
|
Отправлено: 16:32, 04-09-2018 | #30 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. | NiOl | Скриптовые языки администрирования Windows | 7 | 31-01-2019 19:58 | |
VBA - Как присвоить переменной содержимое Range на VBA for WORD | Selena57 | Программирование и базы данных | 1 | 25-03-2009 00:52 | |
[решено] Первая строчка переменной. Как скопировать? | r35TnX | AutoIt | 5 | 06-03-2009 07:12 | |
CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for | akrav | Скриптовые языки администрирования Windows | 4 | 07-01-2008 17:51 | |
js имя объекта из переменной, как? | Вебмастеру | 13 | 15-03-2005 07:22 |
|