Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] .bat: удаление значения реестра после отбора

Ответить
Настройки темы
CMD/BAT - [решено] .bat: удаление значения реестра после отбора

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Есть такой раздел в реестре: HKLM\System\CurrentControlSet\Enum\USB, куда сохраняются любые устройства при присоединении к ПК через USB.
В данном разделе при присоединении устройства создаются подразделы (назовем их для удобства подразделы 1), содержащие в названии Vid и Pid устройств, например:
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544
HKLM\System\CurrentControlSet\Enum\USB\Vid_03f0&Pid_3b17
и т.д.

В свою очередь, в этих подразделах (1) создаются еще подразделы (2), содержащие в названии SN устройств, например:
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\0765432567654
HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\2131231233231
и т.д.

В подразделах (2) есть параметр типа REG_SZ, который называется Service. Он содержит информацию о том, что за устройство было подключено.
Например, если он равен USBSTOR, то была подключена флешка.
===================================
Теперь сама задача, которую я устал решать вручную:
Нужно удалить с ПК все флешки.
Необходимо, чтобы умный bat-файл проверял каталог HKLM\System\CurrentControlSet\Enum\USB на содержимое файлов Service (которые лежат в подразделах (2), причем имена подразделов (1) и (2) у всех устройств разные), а потом удалял нужный подраздел (1),
например:
Флешка была HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544\0765432567654 (параметр Service=USBSTOR), значит нужно удалить подраздел HKLM\System\CurrentControlSet\Enum\USB\Vid_0930&Pid_6544.

Проблема в том, что нельзя просто удалить папку USB, т.к. в ней, помимо флешек, еще много всего нужного - USB-хабы, принтеры, мышки, USB-порты виртуальных машин и т.д.

Я так понимаю, что нужен предварительный поиск и сохранение пути для удаления в какую-то переменную, причем это должно быть в цикле, но сколько с интернета всего скачал - ничего не получается собрать вместе.
Заранее огромное спасибо, господа скриптеры .

Отправлено: 11:36, 16-08-2011

 

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Не могу этот скрипт оптимизировать под последнюю задачу:

Ветка реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}
Здесь куча подразделов с именами 0000, 0001, 0002, 0003, ...
В этих подразделах есть параметр DriverDesc, у которого могут быть разные значения.
Нужно удалить все подразделы 0000, 0001, 0002, 0003, ..., в которых параметр DriverDesc=Запоминающее устройство для USB

Помогите, пожалуйста.
Пытался исправить скрипт SendMessage - ничего не получилось, не могу понять, где указать, что проверять не на 2 уровня ниже, а на 1, и проблема с русским содержимым параметра DriverDesc.

Заранее спасибо огромное!

Отправлено: 08:53, 17-08-2011 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вот сам сделал такое, но в конце он вместо названия подраздела вставляет InfSection REG_SZ USBSTOR_BULK
Почему он это делает понятно, но как сюда вместо этого добавить название подраздела - не понимаю.

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr /rc:^USBSTOR_BULK$') do (
if "%%a"=="InfSection REG_SZ USBSTOR_BULK" (echo reg delete %Section%\%%a /f >> 1.txt)

Отправлено: 10:02, 17-08-2011 | #12


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата Lightman123:
как сюда вместо этого добавить название подраздела »
Так?
Код: Выделить весь код
@echo off
setlocal

set "section=hklm\system\controlset001\control\class\{36FC9E60-C465-11CF-8056-444553540000}"

for /f "tokens=3" %%i in ('reg query "%section%" /v "infsection"') do (

    if /i "%%i"=="USBSTOR_BULK"  reg delete "%section%" /v "infsection" /f

)
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:26, 17-08-2011 | #13


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Почему-то не работает...
Может я неправильно объяснил мысль - название подразделов мне неизвестны, т.е. я не могу в вашем скрипте в infsection дописать что-то от себя.
Подраздел может быть любой из диапазона 0000-NNNN

Отправлено: 10:40, 17-08-2011 | #14


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Не понимаю почему отличается вывод двух кодов:

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr "%Section%\\Vid_ USBSTOR"') do (echo >> 1.txt)

setlocal enabledelayedexpansion
set "Section=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}"
for /f "tokens=*" %%a in ('reg query %Section% /s ^| findstr "%Section%\\00 USBSTOR"') do (echo >> 1.txt)

В первом случае выдает ЦЕЛИКОМ пути, а во втором - список [имя_файла тип значение].
Уже взрыв мозга случился, помогите, пожалуйста, со скриптом.

Мне кажется, что проблема в {} во втором случае, но как ее решить - не могу понять.
Точно, проблема в фигурных скобках.

Последний раз редактировалось Lightman123, 17-08-2011 в 12:02.


Отправлено: 11:33, 17-08-2011 | #15


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Lightman123,
Если честно ничего не понял. Удалить все USBSTORE?
Попробуй так:
Код: Выделить весь код
@echo off
setlocal

set "regroot=HKLM\System\CurrentControlSet\Enum\USB"

for /f "tokens=*" %%i in ('reg query "%regroot%" /v Service /s') do call:del "%%i"
goto:eof

:del
0>nul set /p="%~1" | 1>nul findstr /b "HKEY.*" && set "regpath=%~1" || set "param=%~1"

for /f "tokens=3" %%i in ("%param%") do if /i "%%i"=="USBSTOR" (

    echo reg delete "%regpath%" /v Service /f

)
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:31, 17-08-2011 | #16


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Извините, если запутал, косноязычен .

Еще раз повторю свою проблему:

Ветка реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}
Здесь куча подразделов с именами 0000, 0001, 0002, 0003, ...
В этих подразделах (практически в каждом) есть параметр InfSection, у которого могут быть разные значения.
Нужно удалить все подразделы 0000, 0001, 0002, 0003, ..., в которых параметр InfSection=USBSTOR_BULK.

Сейчас попробую ваш скрипт переделать.

Отправлено: 12:36, 17-08-2011 | #17


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Код: Выделить весь код
@echo off
setlocal

for /f "tokens=*" %%i in ('reg query "hklm\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}" /v InfSection /s') do call:del "%%i"
goto:eof

:del
0>nul set /p="%~1" | 1>nul findstr /b "HKEY.*" && set "regpath=%~1" || set "param=%~1"

for /f "tokens=3" %%i in ("%param%") do if /i "%%i"=="USBSTOR_BULK" (

    echo reg delete "%regpath%" /v InfSection /f
    set "regpath="
    set "param="

)
PS. Не знаю сработает или нет reg delete.

Последний раз редактировалось Foreigner, 17-08-2011 в 13:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:00, 17-08-2011 | #18


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо!

Только не запускается - ругается, что слишком много параметров в командной строке.
Как мне кажется, ругается на /v и /s в одной строке.

Отправлено: 13:05, 17-08-2011 | #19


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Lightman123,
Пример выше, последний, все отработал как положено (без удаления, только вывел на экран через echo)
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:13, 17-08-2011 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] .bat: удаление значения реестра после отбора

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Получение значения параметра реестра IfoR Скриптовые языки администрирования Windows 6 08-04-2010 12:54
CMD/BAT - [решено] Получение значения параметра реестра user_123 Скриптовые языки администрирования Windows 3 05-04-2010 13:10
Разное - Изменение значения реестра через батник Raver777 Microsoft Windows 2000/XP 3 22-03-2009 23:46
Разное - Изменить значения реестра из другой ОС Белтон Лечение систем от вредоносных программ 5 10-05-2008 17:09
Доступ - Авто экспорт значения ключа из реестра Billy Bones Microsoft Windows 2000/XP 3 26-07-2007 11:50




 
Переход