Показать полную графическую версию : [решено] .bat: удаление значения реестра после отбора
Lightman123
16-08-2011, 11:36
Добрый день!
Весь день в гугле, но поскольку сам далек от программирования, то ничего толком не получается.
Помогите, пожалуйста, решить непосильную задачу:
Есть такой раздел в реестре: 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-порты виртуальных машин и т.д.
Я так понимаю, что нужен предварительный поиск и сохранение пути для удаления в какую-то переменную, причем это должно быть в цикле, но сколько с интернета всего скачал - ничего не получается собрать вместе.
Заранее огромное спасибо, господа скриптеры :) .
Lightman123
16-08-2011, 11:48
Нашел такое:
@echo off
set sKey=HKCU\Software\Microsoft\Internet Explorer\TypedURLs
for /f "delims= " %%i in ('reg.exe query "%sKey%" ^| find /i "www.microsoft.com"') do (reg.exe delete "%sKey%" /v "%%i" /f >nul)
Почти подходит, надо только чтобы удалял не просто параметр, а еще и 2 подраздела выше.
И искал на 2 раздела ниже, не зная их названий.
Lightman123, не совсем в тему, но...
Есть замечательная утилита USBDeview (http://www.nirsoft.net/utils/usb_devices_view.html) которая отображает все USB девайсы в системе, а так же может удалять их следы
Lightman123
16-08-2011, 11:58
Да, я знаю, спасибо, но USBDeview удаляет только из USB, причем только из CurrentControlSet, а при присоединении флешки следы остаются более чем в 15 ветках реестра.
Хочу все засунуть в 1 bat файл для ускорения процесса.
следы остаются более чем в 15 ветках реестра. »
хоть 30 веток в разделе HKEY_LOCAL_MACHINE\SYSTEM\ будет,
а используются только 2
указанные в ключах
HKEY_LOCAL_MACHINE\SYSTEM\Select
Current и LastKnownGood
все остальные висят вхолостую и не используются
Lightman123
16-08-2011, 12:28
Да, я это знаю, спасибо.
Я говорю это к тому, что даже если взять только каталог CurrentControlSet, то в нем факт подключения флешки остается более чем в 15 ветках!
USB, USBSTOR, RemovableMedia, DeviceClasses, USBFlags и т.д.
Большую часть из них я уже объединил в 1 файл, но там все просто - удаляется целиком раздел, потом новый создается.
А вот с USB затык - тут нужен предварительный отбор.
Помогите, пожалуйста, со скриптом :)
то в нем факт подключения флешки остается более чем в 15 ветках! »
И что?
Какова конечная цель? Вам надо предотвратить использование новых и уже ранее подключённых флэшек? Или Вы пытаетесь следы использования зачистить?
Lightman123
16-08-2011, 12:50
Зачистить следы. Устал это делать вручную в реестре + USBDeview.
Большая часть веток уже добавлена в bat-файл, а вот с этой возник затык...
SendMessage
16-08-2011, 15:07
@echo off
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 (
if "%%a"=="Service REG_SZ USBSTOR" (if "!ps:~0,4!"=="Vid_" echo reg delete "%Section%\!ps!" /f >> usbstor.txt)
set "ps=!s!"&set "s=%%~na"
)
То, что выделено красным, нужно убрать. Но я настоятельно советую прежде запустить в нынешнем виде и проверить в реестре правильность скрипта.
Lightman123
16-08-2011, 15:32
Огромное спасибо! Работает!
Lightman123
17-08-2011, 08:53
Не могу этот скрипт оптимизировать под последнюю задачу:
Ветка реестра 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.
Заранее спасибо огромное!
Lightman123
17-08-2011, 10:02
Вот сам сделал такое, но в конце он вместо названия подраздела вставляет 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)
Foreigner
17-08-2011, 10:26
как сюда вместо этого добавить название подраздела »
Так?
@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
)
Lightman123
17-08-2011, 10:40
Почему-то не работает...
Может я неправильно объяснил мысль - название подразделов мне неизвестны, т.е. я не могу в вашем скрипте в infsection дописать что-то от себя.
Подраздел может быть любой из диапазона 0000-NNNN
Lightman123
17-08-2011, 11:33
Не понимаю почему отличается вывод двух кодов:
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)
В первом случае выдает ЦЕЛИКОМ пути, а во втором - список [имя_файла тип значение].
Уже взрыв мозга случился, помогите, пожалуйста, со скриптом.
Мне кажется, что проблема в {} во втором случае, но как ее решить - не могу понять.
Точно, проблема в фигурных скобках.
Foreigner
17-08-2011, 12:31
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
)
Lightman123
17-08-2011, 12:36
Извините, если запутал, косноязычен :) .
Еще раз повторю свою проблему:
Ветка реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-44455340000}
Здесь куча подразделов с именами 0000, 0001, 0002, 0003, ...
В этих подразделах (практически в каждом) есть параметр InfSection, у которого могут быть разные значения.
Нужно удалить все подразделы 0000, 0001, 0002, 0003, ..., в которых параметр InfSection=USBSTOR_BULK.
Сейчас попробую ваш скрипт переделать.
Foreigner
17-08-2011, 13:00
@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.
Lightman123
17-08-2011, 13:05
Спасибо!
Только не запускается - ругается, что слишком много параметров в командной строке.
Как мне кажется, ругается на /v и /s в одной строке.
Foreigner
17-08-2011, 13:13
Lightman123,
Пример выше, последний, все отработал как положено (без удаления, только вывел на экран через echo)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.