Показать полную графическую версию : [решено] Как работать с переменной внутри цикла FOR?
к сожалению не помогло... ситуация осталась той же »
Приведите полный код пакетного файла (включающего определение «%starting%», «%ending%»), содержимое «conf.ini».
dimitrioglo
18-06-2013, 10:07
Приведите полный код пакетного файла »
@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
dimitrioglo
18-06-2013, 18:17
Все, решил свою задачу, остановился на обыном методе 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
Всем огромное спасибо за помощь..!
kvant-07
01-06-2018, 10:31
Подскажите, где ошибся...
есть папка с файлами 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
megaloman
01-06-2018, 14:58
kvant-07, @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 либо упаковать?
Подскажите, где ошибся... »
Первая и грубая ошибка:
внутри оператора скобок, динамически изменяемые переменные, внутри тех же скобок, необходимо раскрывать с помощью отложенного расширения. Т.о. у Вас нерабочий код в обоих случаях...
во втором случае, это проявится при условии истинности 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
какой-то странный глюк с циклом.
беру примитивную задачу:
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 перепрыгивает вниз?
Petya V4sechkin
04-09-2018, 11:37
Что ему мешает исполняться для всех из списка?
Раннее связывание мешает.
Чтобы включить связывание времени выполнения, нужно добавить в начало батника:
SetLocal EnableDelayedExpansion
и при обращении к переменной вместо %FTMP% использовать !FTMP!
megaloman
04-09-2018, 11:51
Если не использовать SetLocal EnableDelayedExpansion для связывания времени выполненияset FTMP=%%G.tmp
echo regedit 4 >%%G.tmp
echo HKU\%%G\Software\Microsoft\Windows\CurrentVersion\Explorer >>%%G.tmpон создаёт один батник с именем (исходный)-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 файл.
После цикла предсказуемо получите содержимое для последней строки.
он создаёт один батник с именем (исходный)-1.бат, и с подставлением S-1-5-18. »Не понятно, с каким именем Вы хотите получить выходные файлы. Зачем пытаетесь сделать какие-то tmp
почему меняется порядок? Почему 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).
какой-то странный глюк с циклом. »
Это не глюк c циклом, это неправильное раскрытие переменных внутри оператора "скобки"
Как сказали выше, для этого требуется отложенное расширение переменных...
Для наглядности:
@echo off
setlocal enabledelayedexpansion
set x=1
(
set x=2
echo x = %x% - неправильно
echo x = !x! - правильно
)
pause
Почему 18 перепрыгивает вниз? »
И это не глюк цикла. Как уже сказали выше: что reg выдает, то и получаем на выходе
Если требуется сортировка:
...('reg query HKU^|sort')...
Про имена выходных файлов, тоже написали...
В общем, для полноценной помощи, необходима правильная формулировка задачи, а не неправильные попытки её решения...
Не понятно, с каким именем Вы хотите получить выходные файлы. Зачем пытаетесь сделать какие-то tmp »
в принципе, я хотел убедиться, что сама идея работает.
Это подзадача к более ранней (http://forum.oszone.net/thread-336314.html).
Отсюда и цикл - внести переменную в значения, которые потом вносить в реестр или передавать setacl -у, поскольку напрямую переменную перед передачей параметров не ресолвило. В итоговом цикле разные имена файлов не нужны, достаточно в конце цикла задать исполнение его, ожидание исполнения, и цикл заново, перезаписать для другого юзера.
Про слеш в имени - ага, не подумал.. Думал, команда цикла будет выдавать список только самих ключей без родителя. Отсюда еще одна ошибка в выводящемся коде (и еще одна причина сначала посмотреть, что выведется, а не пускать на исполнение сразу))
Насчет !FTMP! мне было неочевидно, в промежутках меж работы гуглил, листал маны, так и не нашел, почему надо делать так, а не обычным процентом.
Но сработало.
Правда как-то странно:
В вывод даёт полный набор строк от первого, 18 юзера, и только по одной строке от остальных.
regedit 4
setacl.exe -on HKU\HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice -ot reg -actn trustee -trst n1:domain\adminuser;ta:remtrst;w:dacl
reg delete HKU\HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-18\Software\Classes\.adoc /f
reg delete HKU\HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-21-blabla\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-21-blabla_Classes\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
reg delete HKU\HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.adoc\UserChoice /f
апд, нашел глюк, я эту строку тупо забыл с % на ! заменить.
сработало только когда я заремил переименование вывода, чтоб всё выводило в один файл..
Насчет !FTMP! мне было неочевидно, в промежутках меж работы гуглил, листал маны, так и не нашел, почему надо делать так, а не обычным процентом. »
setlocal /?
и пример из этой же темы выше (http://forum.oszone.net/post-2829943.html#post2829943) — переменные окружения, находящиеся в обрамлении %…% внутри операторных скобок, раскрываются при входе в эти скобки. Сразу и однократно. Вот поэтому нужно отложенное раскрытие переменных окружения и обрамление !…!.
Petya V4sechkin
07-09-2018, 18:30
bredych, дополнительно о связывании можете почитать здесь:
set /?
с примерами.
alexfrienmank
23-11-2018, 06:53
Здравствуйте!
Помогите, пожалуйста, с ошибкой в коде.
Цикл ищет определенный текст в реестре, затем записывает адрес текста в переменную. Но почему-то переменная оказывается пустая.
chcp 1251
set flg=true
for /f "tokens=1" %%i in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products /f https://support.cryptopro.ru/ /d /s') do (
if flg equ true (
set flg=fls
set x="%%i") else goto proc)
:proc
echo %x%
pause
exit
alexfrienmank,
странно как вообще код запустился - ошибка на ошибке
что показывает просто запуск:
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products /f https://support.cryptopro.ru/ /d /s
и что надо забрать из этого вывода.
alexfrienmank
26-11-2018, 06:09
alpap,
Результат команды:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties
HelpLink REG_EXPAND_SZ https://support.cryptopro.ru/
Поиск завершен: найдено совпадений: 1.
Нужно в переменную записать адрес, например,
x="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties"
Нужно в переменную записать адрес »
ну?
set "var=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties"
в чем проблема, причем тут for ?
alexfrienmank
27-11-2018, 06:49
alpap,
for нужен для поиска адреса в реестре, т.к. адрес может меняться на компьютерах.
Проблема в том, что set var=HKEY... можно сделать, но значение переменной, к сожалению, не сохраняется.
все равно я не понимаю зачем это надо именно так, если что-то внутри этого искать еще понятно ...
@echo off
set "var=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties"
for /f "delims=" %%a in ('2^>nul reg query "%var%"') do set "newvar=%%a"
if defined newvar (echo %newvar%) else echo No registry key or parameter
pause
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.