Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как работать с переменной внутри цикла FOR? (http://forum.oszone.net/showthread.php?t=186913)

alex_past 29-09-2010 22:04 1507739

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


gora 29-09-2010 22:11 1507744

Переменные в цикле заключите в восклицательные знаки (!) вместо знаков процента (%), а в начало скрипта добавьте 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 1507747

Или без 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 1507754

Большое спасибо!
И то, и другое сработало.

dimitrioglo 13-06-2013 10:36 2166912

Товарищи знатоки, устал пытаться реализовать такую штуку, что бы указанный логин разбирался по буквам в цикле
мне надо из 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!

вот тут то и загвоздка... Очень прошу помочь. Заранее спасибо.

gora 13-06-2013 10:50 2166916

dimitrioglo,
Цитата:

Цитата 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 2166932

Спасибо огромное.!
Мне где то даже стыдно)) решение очень красивое, чето я стормозил)))

dimitrioglo 13-06-2013 18:40 2167224

Не плохо продвинулся в своей задаче, но опять ступор... прошу отозваться всех кто знает...
как бы мне проверять в каком регистре получет переменная символы, например:

если "символ" в верхнем регистре сделать то и то...
если в нижнем - другое

не нашел стандартной команды в CMD

Foreigner 13-06-2013 19:57 2167285

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 2167647

Цитата:

Цитата Foreigner
Код:

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 2167771

Цитата:

Цитата dimitrioglo
К сожалению такая конструкция не работает... »

Код:

  > 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 2167776

Может кому то пригодится как проверить символ в верхнем регистре или нет, я добился вот таким образом:
Код:

@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


Iska 15-06-2013 03:31 2167947

Цитата:

Код:

if %var% EQU %String:~-1,1% echo 1
if %var% NEQ %String:~-1,1% echo 2


«else» уже не в моде?

dimitrioglo 17-06-2013 12:03 2169038

Цитата:

Цитата Iska
«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...
В чем косяк..?

gora 17-06-2013 12:56 2169070

Цитата:

Цитата dimitrioglo
В чем косяк..? »

В том, что строка
Код:

set value=%%b
выполняется несколько раз и всегда будет "вытаскивать" последнее значение из цикла.
skip меняет начальное значение цикла, но на последнее значение он ни какого влияния не оказывает (если конечно не превышает число строк в файле).

dimitrioglo 17-06-2013 13:27 2169090

Цитата:

Цитата gora
выполняется несколько раз и всегда будет "вытаскивать" последнее значение из цикла. »

Да, убедился что именно так... но как же тогда ему указать нужную строку..?

gora 17-06-2013 13:32 2169095

Попробуйте так:
Код:

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 2169232

Цитата:

Цитата gora
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 а не как значение переменной... неужели я много прошу...

Iska 17-06-2013 17:29 2169273

Код:

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 2169350

Цитата:

Цитата Iska
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 »

к сожалению не помогло... ситуация осталась той же

Iska 17-06-2013 20:17 2169387

Цитата:

Цитата dimitrioglo
к сожалению не помогло... ситуация осталась той же »

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

dimitrioglo 18-06-2013 10:07 2169683

Цитата:

Цитата 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


dimitrioglo 18-06-2013 18:17 2170154

Все, решил свою задачу, остановился на обыном методе 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 2816395

Подскажите, где ошибся...

есть папка с файлами 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 2816441

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 либо упаковать?

YuS_2 01-06-2018 15:16 2816443

Цитата:

Цитата 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


bredych 04-09-2018 10:21 2829822

какой-то странный глюк с циклом.
беру примитивную задачу:
Код:

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 2829826

Цитата:

Цитата bredych
Что ему мешает исполняться для всех из списка?

Раннее связывание мешает.
Чтобы включить связывание времени выполнения, нужно добавить в начало батника:
Код:

SetLocal EnableDelayedExpansion
и при обращении к переменной вместо %FTMP% использовать !FTMP!

megaloman 04-09-2018 11:51 2829827

Если не использовать 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

Iska 04-09-2018 16:32 2829883

Цитата:

Цитата 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).

YuS_2 04-09-2018 21:26 2829943

Цитата:

Цитата bredych
какой-то странный глюк с циклом. »

Это не глюк c циклом, это неправильное раскрытие переменных внутри оператора "скобки"
Как сказали выше, для этого требуется отложенное расширение переменных...
Для наглядности:
Код:

@echo off
setlocal enabledelayedexpansion
set x=1
(
set x=2
echo x = %x% - неправильно
echo x = !x! - правильно
)
pause

Цитата:

Цитата bredych
Почему 18 перепрыгивает вниз? »

И это не глюк цикла. Как уже сказали выше: что reg выдает, то и получаем на выходе
Если требуется сортировка:
Код:

...('reg query HKU^|sort')...
Про имена выходных файлов, тоже написали...
В общем, для полноценной помощи, необходима правильная формулировка задачи, а не неправильные попытки её решения...

bredych 07-09-2018 12:06 2830379

Цитата:

Цитата megaloman
Не понятно, с каким именем Вы хотите получить выходные файлы. Зачем пытаетесь сделать какие-то tmp »

в принципе, я хотел убедиться, что сама идея работает.
Это подзадача к более ранней.
Отсюда и цикл - внести переменную в значения, которые потом вносить в реестр или передавать 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


апд, нашел глюк, я эту строку тупо забыл с % на ! заменить.
сработало только когда я заремил переименование вывода, чтоб всё выводило в один файл..

Iska 07-09-2018 17:13 2830430

Цитата:

Цитата bredych
Насчет !FTMP! мне было неочевидно, в промежутках меж работы гуглил, листал маны, так и не нашел, почему надо делать так, а не обычным процентом. »

Код:

setlocal /?
и пример из этой же темы выше — переменные окружения, находящиеся в обрамлении %…% внутри операторных скобок, раскрываются при входе в эти скобки. Сразу и однократно. Вот поэтому нужно отложенное раскрытие переменных окружения и обрамление !…!.

Petya V4sechkin 07-09-2018 18:30 2830447

bredych, дополнительно о связывании можете почитать здесь:
Код:

set /?
с примерами.

alexfrienmank 23-11-2018 06:53 2842216

Здравствуйте!
Помогите, пожалуйста, с ошибкой в коде.
Цикл ищет определенный текст в реестре, затем записывает адрес текста в переменную. Но почему-то переменная оказывается пустая.
Код:

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


alpap 23-11-2018 20:03 2842311

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 2842633

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"

alpap 27-11-2018 01:14 2842786

Цитата:

Цитата alexfrienmank
Нужно в переменную записать адрес »

ну?
Код:

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 2842796

alpap,
for нужен для поиска адреса в реестре, т.к. адрес может меняться на компьютерах.
Проблема в том, что set var=HKEY... можно сделать, но значение переменной, к сожалению, не сохраняется.

alpap 27-11-2018 23:10 2842971

все равно я не понимаю зачем это надо именно так, если что-то внутри этого искать еще понятно ...
Код:

@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


Iska 28-11-2018 00:30 2842992

alpap, он-то изначально ищет внутри …\Products, а не внутри …\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties.

alexfrienmank 28-11-2018 12:02 2843051

Iska,
Всё так.
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.

Цитата:

Цитата alpap
for /f "delims=" %%a in ('2^>nul reg query "%var%"') do set "newvar=%%a" »

Работает, но записывает только последнее значение, а нужно первое.

alpap 28-11-2018 16:19 2843096

Цитата:

Цитата alexfrienmank
а нужно первое »

Код:

set "var=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties
"

set newvar=
for /f "delims=" %%a in ('2^>nul reg query "%var%"') do if not defined newvar set "newvar=%%a"
echo Это первое - %newvar%
pause



Время: 16:56.

Время: 16:56.
© OSzone.net 2001-