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

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

VoinLuny 25-05-2012 17:13 1922539

Проблема с переходом к определенному ключу реестра
 
Всем доброго времени суток в которое Вы читаете данный пост!
http://forum.oszone.net/thread-184844.html здесь я нашел код для записи значения из реестра в .txt файл.
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Binary Fortress Software\DisplayFusion\Wallpaper"^|Find /I "Wallpaper_0_FileName"`) Do Echo %%J>text.txt
Всё бы хорошо, но путь к моему ключу выглядит так:
Код:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\System\CurrentControlSet\Control\VIDEO\{1A3EB677-F210-43AE-85B9-C6964FF59BF6}\0000
Моя проблема:
Мне нужно, чтобы вместо {1A3EB677-F210-43AE-85B9-C6964FF59BF6} батник просто проходил в первый подраздел раздела VIDEO, поскольку на разных компьютерах эти идентификаторы будут разные, а мне нужно, чтобы файл работал на всех компах с Win7. Помогите, пожалуйста!

Iska 25-05-2012 21:26 1922670

VoinLuny, например, так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\System\CurrentControlSet\Control\VIDEO

for /f "delims=" %%i in ('reg.exe query "%sPath%" ^| find.exe "{"') do (
        reg.exe query "%%i"
        goto :Teminate
)

:Teminate

endlocal
exit /b 0


VoinLuny 25-05-2012 21:32 1922674

Iska, благодарю за решение, а можно попросить комментарии? Просто я не совсем понимаю принцип работы оператора FOR даже читая мануал по нему, хотелось бы человеческим языком, чтобы понять, что пишу. Заранее спасибо!

Iska 25-05-2012 22:36 1922721

1. Исполняется команда:
Код:

reg.exe query "%sPath%"
2. Вывод команды «reg.exe» передаётся по конвейеру («|») на вход команды:
Код:

find.exe "{"
которая фильтрует полученный текст, оставляя только строки, в которых содержится указанный символ («{»).

3. Вывод команды «find.exe» передаётся на построчный разбор команде «for /f»:

* чтобы указать, что мы разбираем именно вывод команды, а не содержимое файла, внутри скобок мы используем апострофы («'…'»), внутри которых мы указываем саму команду (в данном случае — несколько команд, объединённых конвейером);
* чтобы символ конвейера был отнесён интерпретатором не к самой команде «for /f», а к указанным для исполнения командам, мы его экранируем символом «^»;
* дабы строки воспринимались цельной лексемой — мы указываем атрибутом «delims» отсутствие разделителей лексем [только сейчас увидел и поправил в предыдущем коде свою очередную тупую описку — двойной знак равенства при атрибуте «delims»].

4. Результаты разбора будут доступны внутри цикла разбора «for /f» через указанную переменную «%%i».

5. После разбора первой же строки мы безусловно переходим на указанную метку «:Teminate», тем самым обрывая разбор.

VoinLuny 26-05-2012 00:37 1922783

Iska, объяснил доступно, спасибо! :clapping:
Последний момент: Когда я выполнил код который ты скинул - реестр открылся в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\0001\System\CurrentControlSet\Control\VIDEO\{1A3EB677-F210-43AE-85B9-C6964FF59BF6}\0000, но я не заметил в твоем коде упоминания последнего подраздела (0000). Как так?

Iska 26-05-2012 02:13 1922812

Команда:
Код:

reg.exe query "<путь>"
перечисляет содержимое первого уровня указанного раздела. В том числе и имя подраздела «…\0000», который там находится. Было бы несколько подразделов и параметров в разделе — команда вывела бы их все на экран.

VoinLuny 26-05-2012 02:52 1922818

Всё понял, огромное спасибо!!!

sov44 28-05-2012 12:55 1923857

При выполнении скрипта появляется непонятный раздел (его нет в реестре) и соответственно, ошибка. Полтергейст какой-то. :) Поясните, что за раздел и как убрать сообщение об ошибке.
Windows XP SP3 , Office 2003
Код:

@ECHO OFF
setlocal enableextensions enabledelayedexpansion
SET UNISTALL=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\9140110900063D11C8EF10054038389C\Patches
FOR /f "tokens=12 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
FOR /f "tokens=1,2,3" %%b IN ('reg query "%UNISTALL%\%%a" ^| FIND /I "MoreInfoURL"') DO (
FOR /f "tokens=4 delims=/" %%c IN ("%%d") DO (
set "Upd=%%c"
ECHO KB!Upd!
)))
pause
exit

картинка


Время: 00:06.

Время: 00:06.
© OSzone.net 2001-