2014-10-01 2 views
0

В настоящее время я работаю над пакетным файлом, чтобы удалить все ключи реестра, содержащие или названные определенной строкой (да, я знаю, что это опасно), однако я имея несколько проблем.Удаление всех разделов реестра, содержащих или называемых "string", с Batch

Код я пытался использовать это:

@echo off 
set "key=HKEY_LOCAL_MACHINE\SOFT-EXT" 
set "search=string" 
for /f "delims=" %%a in ('reg query "%key%" /s^| findstr "%search%"') do reg delete "%key%" /v "%%~a" 

Это работает для очень конкретной, заранее определенной области реестра - единственный недостаток для меня является то, что мой сценарий должен разобрать ВЕСЬ улей SOFTWARE реестра , который загружается с внешнего накопителя. В настоящее время скрипт будет работать около ~ 20 секунд без возврата в командной строке. После этого я получаю строки, содержащие FINDSTR: Line 50300 too long, с увеличивающимся значением номера строки. Некоторое краткое чтение заставляет меня думать, что findstr может управлять только таким количеством байтов данных, и я, очевидно, перегружаю его из-за массивного размера этого куста реестра (около 80-100 МБ каждый).

Чтобы устранить эту проблему, я попытался изменить цикл, чтобы иметь дополнительный запрос с двумя условными && с и ||, однако, это не работает, либо, потому что иногда ключ реестра, содержащий строку может быть названа HKLM\SOFTWARE\Classes\CSID\{###-###-###}\Example , с DWORD с именем Name и значением данных string.

Есть ли способ сделать то, что я хотел бы сделать с пакетным файлом? Я считаю, что это возможно сделать с PowerShell, однако среда, в которой я работаю, не поддерживает сценарии PowerShell или VB.

+1

Попробуйте использовать findstr вместо поиска. –

+0

Извините - это действительно findstr в коде. Я ошибся. – John

ответ

1

Я не совсем уверен, что вы хотите:

Вы действительно хотите удалить системный реестр ключей, отображаемые на левой стороне в дереве в Regedit как написано в названии вопроса, или реестр ЗНАЧЕНИЕ типа ? (REG_SZ?), Отображаемый с правой стороны в Regedit.

Я думаю, вы хотите удалить значения реестра типа ?, что намного сложнее, чем удаление ключей реестра.

Вот код партии для поиска ключей реестра и просто отправьте их по электронной почте с помощью Action=Find или дополнительно удалите их с помощью Action=Delete в верхней части кода с комментариями.

Настоятельно рекомендуется запустить этот пакетный код сначала с Action=Find, как опубликован здесь, и найти найденные ключи реестра, прежде чем удалять их, используя Action=Delete.

@echo off 
setlocal 

rem Change value "Find" to "Delete" to really delete all found keys. 
set "Action=Find" 

rem Define the root key for the search. 
set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE" 

rem Define the string which must be found in name of a key to delete. 
rem It should not contain characters interpreted by FINDSTR as regular 
rem expression character, see help output on entering FINDSTR /? in a 
rem command prompt window. 
set "Search=ABCDEFGHIJKLM" 

rem Check if specified registry key exists at all. 
%SystemRoot%\System32\reg.exe query "%RegKey%" 1>nul 2>nul 
if not errorlevel 1 goto RunSearch 

echo. 
echo Registry key "%RegKey%" not found. 
goto EndBatch 

:RunSearch 
rem Exporting everything of defined root key to a temporary text file. 
echo Exporting registry key "%RegKey%" ... 
%SystemRoot%\System32\reg.exe query "%RegKey%" /s >"%TEMP%\RegExport.tmp" 2>nul 

rem The backslash is the escape character in regular expressions. Therefore 
rem it is necessary to escape this character in root registry key to get a 
rem working regular expression search string as long as the root registry 
rem key and the search string do not contain other characters with special 
rem registry expression meaning. 
set "RegKey=%RegKey:\=\\%" 

rem Interesting are only lines in exported registry which contain the 
rem search string in last key of a registry key path. In other words 
rem the deletion of a key is always done only on root key containing in 
rem name the search string and not also on all subkeys to improve speed. 

if /I "%Action%"=="Delete" (
    echo Searching for keys containing "%Search%" and delete all found ... 
) else (
    echo Searching for keys containing "%Search%" and list all found ... 
) 

rem The expression below works only correct if whether RegKey nor 
rem Search contains characters with a regular expression meaning. 
set "FoundCounter=0" 
set "DeleteCounter=0" 
for /f "delims=" %%K in ('%SystemRoot%\System32\findstr.exe /R "^%RegKey%.*%Search%[^\\]*$" "%TEMP%\RegExport.tmp" 2^>nul') do (
    echo %%K 
    set /A FoundCounter+=1 
    if /I "%Action%"=="Delete" (
     %SystemRoot%\System32\reg.exe delete "%%K" /f >nul 
     if not errorlevel 1 set /A "DeleteCounter+=1" 
    ) 
) 
del "%TEMP%\RegExport.tmp" 

set "FoundPlural=" 
if not %FoundCounter%==1 set "FoundPlural=s" 
set "DeletePlural=" 
if not %DeleteCounter%==1 set "DeletePlural=s" 

echo. 
if /I "%Action%"=="Delete" (
    echo Deleted %DeleteCounter% key%DeletePlural% of %FoundCounter% key%FoundPlural% containing "%Search%". 
) else (
    echo Found %FoundCounter% key%FoundPlural% containing "%Search%". 
) 

:EndBatch 
endlocal 
echo. 
echo Exit with any key ... 
pause >nul 
+0

Я прошу прощения за то, что не ясен - мне нужно удалить все разделы реестра с именем 'string', и мне нужно также искать все значения, содержащие это, например (если строка« Adobe »),' HKLM \ SOFTWARE \ Adobe® Adobe Bridge' и 'HKCR \ .pdfxml - Тип контента: application/vnd.adobe.pdfxml' должны быть удалены. – John

Смежные вопросы