|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - экранировать скобки в данных из реестра |
|
CMD/BAT - экранировать скобки в данных из реестра
|
Новый участник Сообщения: 48 |
Для одного цикла FOR поборол лишние круглые скобки, а дальше отсутствие образования не позволяет :-)
Помогите, пожалуйста, довести до ума скрипт. Делаю на основе этого и этого кода. rem @echo off rem chcp 1251 if not exist "c:\backup\reg" mkdir c:\backup\reg set count=1 for %%? in ( "HKEY_CLASSES_ROOT\TypeLib\{EDCD5812-6A06-43C3-AFAC-46EF5D14E22C}\1.0\HELPDIR\(Default)" ) do ( call :sub %%? ) goto :eof :sub setlocal set "s=%~1" :sub_1 for /f "tokens=1* delims=\" %%i in ("%s%") do set s=%%j& set t=%%i if defined s ((if defined $R_REG (set "$R_REG=%$R_REG%\%t%") else (set "$R_REG=%t%"))& goto %0_1) else (set "$R_VAL=%t%") Set $R_TMP=HKEY_CURRENT_USER\Temp Set $F_REG=c:\backup\reg\%count%.reg Set $F_TMP=c:\backup\reg\%count%.tmp set $R_VAL=%$R_VAL:(=^^(% set $R_VAL=%$R_VAL:)=^^)% Set $N=1 For %%i In (%$R_VAL%) Do Set /A $N+=1 Reg Delete "%$R_TMP%" /f >Nul 2>&1 If Exist "%$F_TMP%" DEL /F/Q "%$F_TMP%" If Exist "%$F_REG%" DEL /F/Q "%$F_REG%" rem set $R_VAL=%$R_VAL:^^(=(% rem set $R_VAL=%$R_VAL:^^)=)% rem echo %$R_VAL% rem pause For /F "Tokens=%$N%* Delims= " %%i In ( 'REG Query "%$R_REG%" /v "%$R_VAL%"^|FindStr /IBRC:"[ ]*%$R_VAL%[ ][ ]*REG_"' ) Do REG ADD "%$R_TMP%" /v "%$R_VAL%" /t %%i /f /d "%%j" >Nul RegEdit /E:A "%$F_TMP%" "%$R_TMP%" For /F "Delims=:" %%i In ('FindStr /BNC:^"[^" "%$F_TMP%"') Do Set $M=%%i For /F "Tokens=1* Delims=:" %%i In ('FindStr /BVNC:^"]^" "%$F_TMP%"') Do ( If %%i EQU %$M% ( Echo.[%$R_REG%]>>%$F_REG% ) ELSE ( Echo.%%j>>%$F_REG% ) ) endlocal del c:\backup\reg\%count%.tmp set /a count=count+1 exit /b 0 |
|
Отправлено: 14:38, 10-01-2016 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать kokos76, не борите. Просто используйте WSH или PoSH для оригинального кода.
|
Отправлено: 15:27, 10-01-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 48
|
Профиль | Сайт | Отправить PM | Цитировать Что, неужели никак? С одной стороны, я ничего не знаю, кроме bat-ников (когда-то в школе интересовался), а с другой стороны, мне нужно, чтобы скрипт мог работать в Безопасном режиме и в Windows RE.
|
Отправлено: 16:03, 10-01-2016 | #3 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать kokos76, если представленный Вами код рабочий, то тогда почти со всеми спецсимволами будет работать такой код:
@echo off rem chcp 1251 if not exist "c:\backup\reg" mkdir c:\backup\reg set count=1 for %%? in ( "HKEY_CLASSES_ROOT\TypeLib\{EDCD5812-6A06-43C3-AFAC-46EF5D14E22C}\1.0\HELPDIR\(Default)" ) do ( call :sub %%? ) goto :eof :sub setlocal set "s=%~1" :sub_1 for /f "tokens=1* delims=\" %%i in ("%s%") do set s=%%j& set t=%%i if defined s ((if defined $R_REG (set "$R_REG=%$R_REG%\%t%") else (set "$R_REG=%t%"))& goto %0_1) else (set "$R_VAL=%t%") Set $R_TMP=HKEY_CURRENT_USER\Temp Set $F_REG=c:\backup\reg\%count%.reg Set $F_TMP=c:\backup\reg\%count%.tmp Set $N=1 For %%i In ("%$R_VAL: =" "%") Do If %%i neq "" Set /A $N+=1 Reg Delete "%$R_TMP%" /f >Nul 2>&1 If Exist "%$F_TMP%" DEL /F/Q "%$F_TMP%" If Exist "%$F_REG%" DEL /F/Q "%$F_REG%" For /F "Tokens=%$N%* Delims= " %%i In ( 'REG Query "%$R_REG%" /v "%$R_VAL%"^|FindStr /IBRC:"[ ]*%$R_VAL%[ ][ ]*REG_"' ) Do REG ADD "%$R_TMP%" /v "%$R_VAL%" /t %%i /f /d "%%j" >Nul RegEdit /E:A "%$F_TMP%" "%$R_TMP%" For /F "Delims=:" %%i In ('FindStr /BNC:^"[^" "%$F_TMP%"') Do Set $M=%%i For /F "Tokens=1* Delims=:" %%i In ('FindStr /BVNC:^"]^" "%$F_TMP%"') Do ( If %%i EQU %$M% ( cmd/v/c Echo.[!$R_REG!]>>%$F_REG% ) ELSE ( Echo.%%j>>%$F_REG% ) ) endlocal del c:\backup\reg\%count%.tmp set /a count=count+1 exit /b 0 Пакетный файл с этим кодом не сможет только обрабатывать имена параметров реестра, содержащие символы Цитата:
Если в обрабатываемых именах параметров будут двойные кавычки, то пакетный файл также может работать некорректно, но кавычки в именах параметров встречаются редко. Да, чуть не забыл написать, что если в обрабатываемой строке встретятся символы процента, то в коде пакетного файла их надо обязательно удваивать при записи такой строки. |
|
Отправлено: 21:16, 10-01-2016 | #4 |
Новый участник Сообщения: 48
|
Профиль | Сайт | Отправить PM | Цитировать Georgio, код рабочий. Со обычными строками работает нормально. Это вывод ошибки в Вашем варианте.
C:\test>Set $N=1 C:\test>For %i In ("(Default)") Do If %i NEQ "" Set /A $N+=1 C:\test>If "(Default)" NEQ "" Set /A $N+=1 C:\test>Reg Delete "HKEY_CURRENT_USER\Temp" /f 1>Nul 2>&1 C:\test>If Exist "c:\backup\reg\1.tmp" DEL /F/Q "c:\backup\reg\1.tmp" C:\test>If Exist "c:\backup\reg\1.reg" DEL /F/Q "c:\backup\reg\1.reg" C:\test>For /F "Tokens=2* Delims= " %i In ('REG Query "HKEY_CLASSES_ROOT\TypeLib\{EDCD5812-6A06-43C3-AFAC-46EF5D14E22C}\1.0\HELPDIR" /v "(Default)"|FindS tr /IBRC:"[ ]*(Default)[ ][ ]*REG_"') Do REG ADD "HKEY_CURRENT_USER\Temp" /v "(Default)" /t %i /f /d "%j" 1>Nul Ошибка: Не удается найти указанный раздел или параметр в реестре. |
|
Отправлено: 23:53, 10-01-2016 | #5 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Цитата kokos76:
Как раз-таки мой вариант кода отработал безошибочно. Если уж параметра с таким именем в реестре нет, то его значение никаким кодом найти невозможно. Очевидно, Вы посчитали за имя параметра отображаемую в реестре запись "(Default)" (то есть "(По умолчанию)") для безымянных параметров. А значения безымянных параметров с помощью такого кода получать невозможно. Нужно писать абсолютно другой код, для чего нужно знать цель Вашей разработки и причину, по которой Вы объединяете изначально имя раздела реестра с именем параметра реестра в одну строку, а не используете их, как обычно это делается, порознь. |
|
Отправлено: 01:20, 11-01-2016 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Georgio:
Цитата kokos76:
|
||
Отправлено: 02:50, 11-01-2016 | #7 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Да уж... Если с вопросительными знаками и астерисками ещё можно справиться, то что делать, когда имя параметра также, как и имя раздела, содержит обратные слеши?.. Хотя, разделить строку, конечно, можно (проверяя существование каждого раздела в этом "псевдопути"), но сложно... |
||
Отправлено: 03:29, 11-01-2016 | #8 |
Новый участник Сообщения: 48
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Georgio:
с параметром (newparameter) скрипт отработал нормально. Вот результат: P.S. Мне нужно бэкапить\восстанавливать параметры реестра из safemode и WinRE. Раз тут так сложно, то, возможно, будет лучше в AutoIt ? |
|
Отправлено: 07:47, 11-01-2016 | #9 |
Новый участник Сообщения: 48
|
Профиль | Сайт | Отправить PM | Цитировать P.p.s. Да, такая запись входных данных - это выходные данные из Process Monitor. Посмотрю после работы, может там можно как-то "подкрутить" экспорт.
|
Отправлено: 08:21, 11-01-2016 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Потребовалось восстановление одного из файлов данных системного реестра.... | vlnik | Microsoft Windows 2000/XP | 5 | 31-03-2014 17:29 | |
Любой язык - [решено] regexp. не закрытые скобки | neprotiv | Скриптовые языки администрирования Windows | 11 | 06-11-2012 05:20 | |
Загрузка - [решено] Можно ли создать образ системы из данных сохранившихся ключей реестра Windows 7? | randa | Microsoft Windows 7 | 5 | 27-07-2011 20:13 | |
CMD/BAT - Перенос данных из реестра в название папки | beata08 | Скриптовые языки администрирования Windows | 2 | 24-02-2011 15:07 | |
CMD/BAT - [решено] Как экранировать символ? | Seryoga204 | Скриптовые языки администрирования Windows | 7 | 27-09-2010 22:50 |
|