Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как работать с переменной внутри цикла FOR?

Ответить
Настройки темы
CMD/BAT - [решено] Как работать с переменной внутри цикла FOR?

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Подскажите, пожалуйста. Не могу понять, что происходит.
Мне нужно, чтобы при каждой итерации в цикле 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 тут вырезано все, что не относилось к этой ошибке
)

Отправлено: 22:04, 29-09-2010

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата dimitrioglo:
к сожалению не помогло... ситуация осталась той же »
Приведите полный код пакетного файла (включающего определение «%starting%», «%ending%»), содержимое «conf.ini».

Отправлено: 20:17, 17-06-2013 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Сайт | Отправить 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
содержимое «conf.ini»
Код: Выделить весь код
[SIMPLE USER]
login - admin1
password - admin2

[SUPER USER]
login - tse32
passwjrd - sQosS79Zj3

Отправлено: 10:07, 18-06-2013 | #22


Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Сайт | Отправить 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
Благодарности: 0

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата kvant-07:
Подскажите, где ошибся... »
Первая и грубая ошибка:
внутри оператора скобок, динамически изменяемые переменные, внутри тех же скобок, необходимо раскрывать с помощью отложенного расширения. Т.о. у Вас нерабочий код в обоих случаях...
во втором случае, это проявится при условии истинности if "%1"=="TD"

А вообще, вот наглядный пример:
Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

set x=1
set y=2

(
set x=555
set y=888
echo x="%x%", y="%y%" - неправильно
echo x="!x!", y="!y!" - правильно
)
pause

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 01-06-2018 в 15:22.


Отправлено: 15:16, 01-06-2018 | #26


Ветеран


Сообщения: 2597
Благодарности: 247

Профиль | Отправить 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%
)
он создаёт один батник с именем (исходный)-1.бат, и с подставлением S-1-5-18.
На этом цикл прекращается.
Что ему мешает исполняться для всех из списка?

Попробовал просто в комстроке еще более простое

Код: Выделить весь код
for /f "skip=1 delims=" %G in ('reg query HKU') DO @echo %G
- получил

Код: Выделить весь код
HKEY_USERS\.DEFAULT
HKEY_USERS\S-1-5-19
HKEY_USERS\S-1-5-20
HKEY_USERS\S-1-5-21-бла-бла
HKEY_USERS\S-1-5-21-бла-бла_Classes
HKEY_USERS\S-1-5-18
почему меняется порядок? Почему 18 перепрыгивает вниз?

Отправлено: 10:21, 04-09-2018 | #27



Moderator


Сообщения: 53175
Благодарности: 15430

Профиль | Отправить PM | Цитировать


Цитата bredych:
Что ему мешает исполняться для всех из списка?
Раннее связывание мешает.
Чтобы включить связывание времени выполнения, нужно добавить в начало батника:
Код: Выделить весь код
SetLocal EnableDelayedExpansion
и при обращении к переменной вместо %FTMP% использовать !FTMP!
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:37, 04-09-2018 | #28


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Если не использовать SetLocal EnableDelayedExpansion для связывания времени выполнения
Код: Выделить весь код
set FTMP=%%G.tmp
echo regedit 4 >%%G.tmp
echo HKU\%%G\Software\Microsoft\Windows\CurrentVersion\Explorer  >>%%G.tmp
Цитата bredych:
он создаёт один батник с именем (исходный)-1.бат, и с подставлением S-1-5-18. »
Ваш код в принципе нерабочий. Моё исправление не сработает тоже.
Вы в цикле получили строки типа 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:
он создаёт один батник с именем (исходный)-1.бат, и с подставлением S-1-5-18. »
Не понятно, с каким именем Вы хотите получить выходные файлы. Зачем пытаетесь сделать какие-то tmp

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 04-09-2018 в 13:21.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:51, 04-09-2018 | #29


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата bredych:
почему меняется порядок? Почему 18 перепрыгивает вниз? »
18 никуда не «перепрыгивает». Раздел HKEY_USERS\S-1-5-18 возвращается последним, потому и стоит в конце списка. reg.exe не занимается сортировкой полученного списка (в отличие от того же редактора реестра regedit.exe, который помещает в дереве слева HKEY_USERS\S-1-5-18 после HKEY_USERS\.DEFAULT и над HKEY_USERS\S-1-5-19).
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:32, 04-09-2018 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как работать с переменной внутри цикла FOR?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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 имя объекта из переменной, как? E-mail Вебмастеру 13 15-03-2005 07:22




 
Переход