1

Тема: CMD/BAT: Поиск в реестре

Доброго времени суток!
Хочу автоматизировать процес:
В ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318} проверить все подразделы этой ветки на наличие в их подразделе "Connection" переменной "Name", значение которой равно известному нам заранее значению (к примеру "Подключение по локальной сети"), и если такая переменная есть берём в качестве результата название этого подраздела.
Я пока застрял на первом этапе....(((
Делаю так:

reg query HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318} /v Name /s /f "Подключение по локальной сети" /d /c /e

Возвращает все значения "Name" найденные в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
Делаю так:

reg query HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318} /s /f "Подключение по локальной сети" /d /c /e

Возвращает всё что равно "Подключение по локальной сети"
Подскажите пожалуйста, как можно реализовать  первый этап.
Второй этап я Слава Богу вроди осилил)) :

for /F "tokens=7 delims=\" %%i in ( "То что нам возвратит первый этап" ) do @echo %%i

Заранее благодарен!!!

2

Re: CMD/BAT: Поиск в реестре

В теме не указано CMD/BAT:

Времени не хватает... :-(

3

Re: CMD/BAT: Поиск в реестре

Евген пишет:

В теме не указано CMD/BAT:

Указал .

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

4

Re: CMD/BAT: Поиск в реестре

The gray Cardinal пишет:

Указал .

Зачтено

Времени не хватает... :-(

5

Re: CMD/BAT: Поиск в реестре

:: вариант 1
reg query ... | findstr "поисковое выражение"

:: вариант 2
reg query ... | find "поисковое выражение"
( 2 * b ) || ! ( 2 * b )

6

Re: CMD/BAT: Поиск в реестре

Что-то наподобие:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceKey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
set sSubKey=Connection


for /f %%i in ('reg.exe query "%sSourceKey%\" /s 2^>nul ^| find.exe /i "%sSourceKey%\{"') do (
    call :GetTempFileName "sTempFileName"

    for /f "tokens=3 delims=    " %%j in (
        'reg.exe query "%%i\%sSubKey%" /v "Name" 2^>nul ^| find.exe /i "Name"'
    ) do echo %%j>>"!sTempFileName!"

    call :ReSet && del !sTempFileName!

    echo !sName!|findstr.exe /i /l /e /c:"Подключение по локальной сети">nul && (
        set sDestKey=%%i\%sSubKey%
        goto :Out
    )
)
:Out

echo %sDestKey%

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:ReSet
    chcp 1251>nul
    <%sTempFileName% set /p sName=
    chcp 866>nul
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Процедура GetTempFileName
rem 
rem %1 : имя переменной для возврата имени временного файла
rem ==========================================================================
:GetTempFileName
    setlocal enableextensions enabledelayedexpansion
    
:NextName
    set sTempFileName="%temp%\temp%random%.tmp"
    
    if exist %sTempFileName% goto :NextName
    
    endlocal & set %~1=%sTempFileName%
    exit /b 0
rem ==========================================================================
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{B7C4C6C6-F876-4FD9-86A6-71B75FA34755}\Connection

P.S. Я тут пробовал-пробовал, затем, устав от некорректной работы «findstr.exe», решил, поскольку учу не торопясь и понемногу PowerShell, попробовать и его:

(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{*}\Connection" | `
    Where-Object {$_.Name -eq "Подключение по локальной сети"} | `
    Select-Object -ExpandProperty PSPath).Replace("Microsoft.PowerShell.Core\Registry::", "")
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{B7C4C6C6-F876-4FD9-86A6-71B75FA34755}\Connection

7

Re: CMD/BAT: Поиск в реестре

P.P.S. В: «for /f "tokens=3 delims=    " %%j in (…» после «delims=» должен быть символ табуляции 0x09. Издержки движка форума — менять вручную.

8

Re: CMD/BAT: Поиск в реестре

echo off
setlocal ENABLEDELAYEDEXPANSION
set hive=
set key=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\
for /f "delims=" %%i in ('reg query %key% /v Name /s ^| findstr /i "%key% Name"') do (
    set stmp=%%i
    if "!stmp:~0,18!"=="HKEY_LOCAL_MACHINE" (
        set hive=%%i
        ) else (
        set skey=%%i
        set skey=!skey: REG_SZ = = !
        echo !hive!
        echo !skey:  =!
        )
    )
Я конечно далек от мысли... (с)

9

Re: CMD/BAT: Поиск в реестре

smaharbA, у Вас какая версия reg.exe? С какой ОС?

10 (изменено: smaharbA, 2010-10-12 09:10:31)

Re: CMD/BAT: Поиск в реестре

Приношу извинения ))
FileVersion  5.2.3790.3959 , win 2003
для ХП

echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 1251 > nul
set hive=
set key=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\
for /f "delims=" %%a in ('reg query %key% /s ^| find /i "%key%" 2^> nul') do (
    reg query "%%a" /v Name 2> nul > nul && (
        for /f "delims=" %%i in ('reg query "%%a" /v Name 2^> nul ^| findstr /i "%key% Name" 2^> nul') do (
            set stmp=%%i
            if "!stmp:~0,18!"=="HKEY_LOCAL_MACHINE" (
                set hive=%%i
                ) else (
                set skey=%%i
                set skey=!skey:REG_SZ==!
                set skey=!skey:  =!
                echo !hive!
                echo !skey:    =!
                )
            )
        )
    )
Я конечно далек от мысли... (с)

11

Re: CMD/BAT: Поиск в реестре

А дальше? У меня зарегистрировано три подключения:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\{73821A21-47EB-4B0B-8DE8-515F96618615}\Connection
    Name=Подключение по локальной сети 2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\{B7C4C6C6-F876-4FD9-86A6-71B75FA34755}\Connection
    Name=Подключение по локальной сети
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\{FF2A55B9-4BE9-4C14-8ECB-C71A367B8900}\Connection
    Name=1394-соединение

Надо отобрать «Подключение по локальной сети». А «findstr.exe», во всяком случае в XP, работает с ANSI некорректно (разбирали здесь: Серый форум / CMD/BAT: обработка (фильтрация) текста и здесь: CMD/BAT - [решено] Поиск строки в значении ключа реестра. [кстати, как с этим в версии Windows 2003? А то, может, сразу брать и reg.exe, и findstr.exe оттуда?!]). Оттого были такие пляски с бубном.

12

Re: CMD/BAT: Поиск в реестре

echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 1251 > nul
set who=Подключение по локальной сети
set hive=
set key=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\
for /f "delims=" %%a in ('reg query %key% /s ^| find /i "%key%" 2^> nul') do (
    reg query "%%a" /v Name 2> nul > nul && (
        for /f "delims=" %%i in ('reg query "%%a" /v Name 2^> nul ^| findstr /i "%key% Name" 2^> nul') do (
            set stmp=%%i
            if "!stmp:~0,18!"=="HKEY_LOCAL_MACHINE" (
                set hive=%%i
                ) else (
                set skey=%%i
                set skey=!skey:REG_SZ==!
                set skey=!skey:  =!
                set skey=!skey:    =!
                if "!skey:%who%=!"=="Name=" (
                    echo !hive!
                    echo !skey!
                    )
                )
            )
        )
    )
Я конечно далек от мысли... (с)

13

Re: CMD/BAT: Поиск в реестре

Огромное спасибо всем откликнувшимся!
Уже, к своему стыду, три дня подряд разбираю только первый вариант батника предоставленого уважаемым alexii 

smaharbA, у Вас какая версия reg.exe? С какой ОС?

Что самое забавное - я это всё пытаюсь реализовать на Windows7...
В строке

for /f %%i in ('reg.exe query "%sSourceKey%\" /s 2^>nul ^| find.exe /i "%sSourceKey%\{"') do (

пришлось убрать "\" после "reg.exe query "%sSourceKey%"
В строке

for /f "tokens=3 delims=    " %%j in (
        'reg.exe query "%%i\%sSubKey%" /v "Name" 2^>nul ^| find.exe /i "Name"'
    ) do echo %%j>>"!sTempFileName!"

после "delims=" оставил один пробел (в семёрке табуляция не подходит) ну и после "tokens=" соответственно поставил 2,* и в конце строки изменил "j" на "k" вобщем строка получилась:

for /f "tokens=2,* delims= " %%j in (
        'reg.exe query "%%i\%sSubKey%" /v "Name" 2^>nul ^| find.exe /i "Name"'
    ) do echo %%k>>"!sTempFileName!"

Но к сожалению с названием коннекта написанным русскими буквами батник не работает...((
Если называю коннект латинскими буквами - то всё ОК...
Пробовал ремить :

rem ==========================================================================
:ReSet
::    chcp 1251>nul
    <%sTempFileName% set /p sName=
::    chcp 866>nul
exit /b 0
rem ==========================================================================

Всё равно не работает...
Может в  Windows7 как-то по другому нужно со сменой кодировки поступать?

Хотел бы ещё задать пару вопросов по этому  батнику для своего развития )) :

1) Что значит:

setlocal enableextensions enabledelayedexpansion

?
2) Как работает:

exit /b 0

?
3) Как работае конструкция:

endlocal & set %~1=%sTempFileName%

?
4) Как работает процедура ReSet :

:ReSet
    chcp 1251>nul
    <%sTempFileName% set /p sName=
    chcp 866>nul
exit /b 0

?

Наверное я сделал глупость не поставив полностью задачу в этой теме...
А задача была такова:
При помощи

netsh int sh int

я загоняю во временный файл информацию о своих сетевых подключениях...
файл получается примерно такого содержания:

Состояние адм.  Состояние     Тип              Имя интерфейса
---------------------------------------------------------------------
Запрещен       Отключен       Выделенный       Подключение по локальной сети

Потом мне надо проанализировать это содержание файла: если в строке в поле "Тип" значение "Выделенный" то мы запоминаем значение поля "Имя интерфейса" из этой строки, и так с каждой строкой...
Ну и потом для каждого "Имени интерфейса" в реестре ищем то что я хотел найти в первом сообщении этой темы...
И для найденного значения (SettingID) применяю:

nvspbind /d "найденое SettingID" ms_tcpip6
nvspbind /d "найденое SettingID" ms_pacer

(nvspbind утилита с помощью которой можно удалить/добавить компоненты заданного/всех сетевых соединений)

Ну и вот что у меня получилось:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceKey=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
set sSubKey=Connection
set sType=Выделенное
netsh int sh int>int.tmp

for /F "skip=3 tokens=3,*" %%i in ( res.tmp ) do (
    if %%i == %sType% for /f %%k in ('reg.exe query "%sSourceKey%" /s 2^>nul ^| find.exe /i "%sSourceKey%\{"') do (
           for /f "tokens=2,* delims= " %%l in ('reg.exe query "%%k\%sSubKey%" /v "Name" 2^>nul ^| find.exe /i "Name"') do (
               if %%m == %%j for /F "tokens=7 delims=\" %%n in ('echo %%k') do (
                     nvspbind /d %%n ms_tcpip6
                     nvspbind /d %%n ms_pacer
                     )                                                
           )
    )
)
    
       
del int.tmp

endlocal
exit /b 0

С "set sType=Выделенное" не сразу получилось:
набрал в Фаре "Выделенное" - не заработало
опять открыл в Фаре, нажал Ф8, опять набрал "Выделенное" - заработало ))))
Ну и почти всё остальное, кроме нескольких мелочей, я передрал у alexii
Очень хотелось бы Вы глянули этот батник.
Может можно было бы сделать более надёжную проверку статуса поля "Тип" (ведь к примеру в ХР поле "Состояние" пустое - может и в семёрке при каких-то обстоятельствах оно может быть пустым)
Ну и вобще в общем что в этом батнике может "не очень красиво" мной написано...
Ведь я пока к сожалению слишком плоско мыслю в написании батников, и эти батники мне очень расширяют кругозор, за что огромнейшее Спасибо!

К сожалению до батника уважаемого smaharbA ещё не добрался - всё это время разбирался с первым вариантом...
Запускать - запускал - работает, но если присутствует искомое нами значение"Подключение по локальной сети" и "не в той что надо")) ветке реестра - батник возвращает и его раздел...(((
Но я обязательно и с этим вариантом попробую разобраться...

Ещё раз Спасибо всем большое за помощ!!!

14

Re: CMD/BAT: Поиск в реестре

Доброго времени суток!
Наконец я добрался и до батника уважаемого smaharbA
Всё понял, кроме:
Почему в строке

set skey=!skey:REG_SZ==!

в коце перед "!" два знака равенства?






==================================================================

И для меня попрежнему остаётся непонятным

endlocal & set %~1=%sTempFileName%

из батника, предоставленого уважаемым alexii.
Почему именно

endlocal & set %~1=%sTempFileName%

, а не

set %~1=%sTempFileName%
endlocal

?



И почему

<%sTempFileName% set /p sName=

, а не

 set /p sName=%sTempFileName%

?
Потому что при смене кодировки нужно емитировать ввод с клавиатуры с поммощью "<" ?

Будте добры, прокоментируйте эти моменты.
Заранее благодарен!!!

15

Re: CMD/BAT: Поиск в реестре

set skey=!skey:REG_SZ==!

В переменной окружения «skey» найти («:») все вхождения подстроки «REG_SZ» и заменить их (первый знак «=») на знак «=» (второй знак); полученный результат присвоить переменной окружения «skey». Подробнее см. в «set /?»:

Подстановка переменной среды может быть расширена следующим образом:

%PATH:str1=str2%

расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в расширенном результате на "str2".  "str2" может быть пустой строкой для эффективного удаления вхождений "str1" из расширенного вывода. "str1" может начинаться со звездочки, и в этом случае это будет соответствовать любому
началу расширенного вывода до первого вхождения оставшейся части "str1".

И для меня попрежнему остаётся непонятным

Тут двумя словами не обойдёшься. Попробуйте осилить вот эту тему: CMD/BAT: возврат значений из процедур через параметры. Там сие изложено в подробностях — как это сделано и вообще — зачем такое было сделано.

…, а не…

Потому что присвоение произойдет в локальном контексте процедуры, а следующей же командой — «endlocal» — созданная локальная переменная будет уничтожена.

<%sTempFileName% set /p sName=

Рассмотрите эту команду иначе:

set /p sName=<%sTempFileName%

т.е. это всего лишь ввод из файла.

set /p sName=%sTempFileName%

выведет приглашение с содержимым переменной «sTempFileName» и будет ожидать ручного ввода.

16

Re: CMD/BAT: Поиск в реестре

alexii, Спасибо большое за ответы!

В переменной окружения «skey» найти («:») все вхождения подстроки «REG_SZ» и заменить их (первый знак «=») на знак «=» (второй знак)

Действительно, там ведь потом идёт условие

if "!skey:%who%=!"=="Name="

т.е. после Name есть знак равенства, вот я ... )))
А вот интересно, как бы выглядела конструкция,если бы я «REG_SZ=» хотел заменить на что-то?

Тут двумя словами не обойдёшься. Попробуйте осилить вот эту тему: CMD/BAT: возврат значений из процедур через параметры. Там сие изложено в подробностях — как это сделано и вообще — зачем такое было сделано.Потому что присвоение произойдет в локальном контексте процедуры, а следующей же командой — «endlocal» — созданная локальная переменная будет уничтожена.

Теперь всё предельно ясно! Большое Спасибо!




Рассмотрите эту команду иначе:

То есть

set /p sName=<%sTempFileName%

равносилно

<%sTempFileName% set /p sName=

?

17

Re: CMD/BAT: Поиск в реестре

SANIOK_AV пишет:

А вот интересно, как бы выглядела конструкция,если бы я «REG_SZ=» хотел заменить на что-то?

А зачем «REG_SZ=» менять? Я такой строки нигде в выводе не видел. Или это теоретический вопрос? У меня не получилось.

SANIOK_AV пишет:

То есть…

Верно. Разбором строк и определением символов перенаправления/конвейера занимается сам интерпретатор команд. И, соответственно, переназначит stdin/sdtout/stderr. А уж воспримет ли это перенаправление программа — зависит только от неё самой.

18

Re: CMD/BAT: Поиск в реестре

Или это теоретический вопрос?

Теоретический.

Верно.

Понятненько, Спасибо!