CMD/BAT - Удаление строк

Ответить
Аватара пользователя
gen0m.rsw

CMD/BAT - Удаление строк

Сообщение gen0m.rsw »

Всем участникам форумы респект!

Вот такая проблема, пользуюсь частенько Regshot, в отчетах (.reg) всегда появляются дублирующие строки

Типа так:

[HKEY_CLASSES_ROOT\CLSID\{11C3CCDE-3BE1-4840-95BC-8063AE5CCE88}]

[HKEY_CLASSES_ROOT\CLSID\{11C3CCDE-3BE1-4840-95BC-8063AE5CCE88}]

@="ColExt Class"


А то и по три!!!

Как можно очистить автоматически удалить дубликаты, оставив лишь нижнею?



И второй вопрос как удалить(в .reg) все строки и значения начинающийся к примеру на

[HKEY_CLASSES_ROOT\CLSID\{11C3CCDE-3BE1-4840-95BC-8063AE5CCE88}]*****

Заранее спасибо!
Аватара пользователя
NiOl

Re: CMD/BAT - Удаление строк

Сообщение NiOl »

Очень сложный вопрос для Batch-файлов - в таких файлах слишком много спецсимволов, на которых батник будет валиться. Быстро поправил старую наработку, но...

ничего не гарантирую, тестируйте и сравнивайте, но скорее всего Вам нужен WBS



Код:

Код: Выделить всё

@Echo off
setLocal EnableExtensions
rem Убрать строки по маске и подобрать подряд идущие одинаковые строки
set Src=*.reg
set Remove=[HKEY_CLASSES_ROOT\CLSID\{11C3CCDE-3BE1-4840-95BC-8063AE5CCE88}]
if not %1_==_ set Src="%~1"
set Remove=%Remove:\=\\%
set Line=set File=.
for /f "tokens=1 delims=" %%F in ('dir /a /b /on %Src%') do (
set File="%%F"
del "%%~dpnF.tmp">nul 2>nul
ren "%%F" *.tmp
if %ErrorLevel%==0 (
findstr /VLC:"%Remove%" "%%~dpnF.tmp">"%%F" 2>nul
del "%%~dpnF.tmp">nul 2>nul
ren "%%F" *.tmp
for /f "UseBackQ tokens=1* delims=" %%L in ("%%~dpnF.tmp") do call :Proceed "%%L"
del "%%~dpnF.tmp">nul 2>nul
) else echo Ошибка! Файл %%F недоступен!
)
goto :end
:Proceed
set Str=%Str%%~1 
shift
if not "%~1"=="" goto :Proceed
if not "%Line%"=="%Str%" echo %Str%>>%File%
set "Line=%Str%"
set Str=
exit /b
:end
Аватара пользователя
amel27

Re: CMD/BAT - Удаление строк

Сообщение amel27 »

Цитата NiOl:



в таких файлах слишком много спецсимволов, на которых батник будет валиться
CMD/BAT - Удаление строк




не так всё безнадежно... ;)



Код:

Код: Выделить всё

@echo off
CALL :DELE_KEY file.reg "[HKEY_CLASSES_ROOT\CLSID\{11C3CCDE-3BE1-4840-95BC-8063AE5CCE88}"
CALL :DISTINCT file.reg
EXIT
:DISTINCT
CHCP 1251 >nul& SETLOCAL DisableDelayedExpansion
(for /f "tokens=*" %%a in ('type "%~1"') do (set "$a=%%a"
  SETLOCAL EnableDelayedExpansion
    if "!$b:~-1,1!"=="\" set "$a=  !$a!"
    if /i not "!$b!"=="!$a!" (if "!$a:~,1!"=="[" echo.)& echo !$a!
  ENDLOCAL& set "$b=%%a"
))>"%~dpn0.tmp"
copy /y "%~dpn0.tmp" "%~1" >nul&& del "%~dpn0.tmp"
CHCP 866 >nul& ENDLOCAL& exit /b
:DELE_KEY
CHCP 1251 >nul& SETLOCAL DisableDelayedExpansion& set "$k=["
(for /f "delims=" %%a in ('type "%~1"') do (set "$a=%%a"
  SETLOCAL EnableDelayedExpansion
    if "!$a:~0,1!"=="[" set "$k=!$a:%~2=]!"
    if "!$k:~0,1!"=="[" (if "!$a:~,1!"=="[" echo.)& echo !$a!
  for /f "delims=" %%i in ("!$k!") do ENDLOCAL& set "$k=%%~i"
))>"%~dpn0.tmp"
copy /y "%~dpn0.tmp" "%~1" >nul&& del "%~dpn0.tmp"
CHCP 866 >nul& ENDLOCAL& exit /b

P.S. поскольку ничего не сказано про кодировку, исходный REG может быть в WIN/Unicode, а результат будет всегда в WIN-кодировке, при желании можно подправить, чтобы результат тоже был юникодовым
Ответить

Вернуться в «Скриптовые языки администрирования Windows»