Удаление папок по критериям
Помогите с удалением каталогов по следующим критериям:
1. Удаление папки у которой меняется имя состоящее из букв и цифр.
2. Удаление папок кроме определенной (либо определенных)
Эти обе задачи между собой не связаны. Просто решил не создовать несколько тем, а задать в одной.
Спасибо.
|
1. ПРимер имени хоть дайте. Не совсем понятно чего нужно.
2.
что-то вроде :
Код:
for /d %%i in (*) do call :d %%i
:d
if not %1=="имя опредененной папки" rd /s /q %1
goto :eof
|
Цитата:
Цитата mitiya
1. ПРимер имени хоть дайте. Не совсем понятно чего нужно. »
|
Например с4р3р4е8у2вке. А надо это для того чтобы удалить папку которою оставляет установщик Net Framework 3.5 SP1
|
Я думаю единственный надежный способ ее идентифицировать, это по содержимому.
Т.е. там в папке должен быть хотя бы какой-то файл который точно идентифицирует эту папку как ту что оставляет Net Framework 3.5 SP1.
примерно так:
Код:
for /d %%i in (*) do call :d %%i
:d
IF EXIST %1\имя_файла rd /s /q %1
goto :eof
код не проверял, просто принцип описал.
|
на счет файлов в ней не помню, а вот папки с файлами в ней присутсвуют
|
Цитата:
что-то вроде :
Код:
for /d %%i in (*) do call :d %%i
:d
if not %1=="имя опредененной папки" rd /s /q %1
goto :eof
|
немного не понятно с этим кодом, он в итоге удалает все с диска. Или вместо * надо указать путь(диск) откуда надо удалять?
|
Цитата:
Цитата jentoso
Помогите с удалением каталогов по следующим критериям:
1. Удаление папки у которой меняется имя состоящее из букв и цифр.
2. Удаление папок кроме определенной (либо определенных)
Эти обе задачи между собой не связаны. Просто решил не создовать несколько тем, а задать в одной.
Спасибо. »
|
Цитата:
Цитата jentoso
А надо это для того чтобы удалить папку которою оставляет установщик Net Framework 3.5 SP1 »
|
пример как неверно сформулированная задача приводит к дурацкой реализации
Почему нельзя стереть по атрибуту времени? (созданный в последний час например?) Или провести dir /a:d /b /t:c /o:-d >datafile.txt с последующей установкой NET(обычно временный каталог организуется на диске с наибольшим свободным дисковым пространством) и проверкой наличия НОВОСОЗДАННОГО каталога в списке - религия не позволяет?
А указание OS вообще видимо не обязательно? А ведь многие конструкции отличаются
А реализация дурацкая в алгоритме может стоило бы учесть, что может быть список запрещённых к стиранию каталогов, а не один каталог? и реализовать через расширенный фор, если нужно именно так?
реализация исключений через файл со списком здесь http://forum.oszone.net/thread-106528-6.html
|
Vlad02, задача сформулирована так как она есть на самом деле.
Цитата:
Цитата Vlad02
Почему нельзя стереть по атрибуту времени? (созданный в последний час например?) »
|
А вдруг за этот час была создана какая-нибудь нужная директория.
По поводу Религии вопрос вообще не уместен.
Цитата:
Цитата Vlad02
А реализация дурацкая в алгоритме может стоило бы учесть, что может быть список запрещённых к стиранию каталогов, а не один каталог? и реализовать через расширенный фор, если нужно именно так? »
|
В этом нет потребности, но если бы описали то не было лишним.
|
jentoso
1. К сожалению, неизвестна минимальная длина временного каталога, например, для 12:
Код:
@Echo Off
Set $FLEN=12
Set $ROOT=C:
:LEN_LOOP
Set /A $FLEN-=1
Set $REG=%$REG%[0-9a-f]
If %$FLEN% GTR 0 GoTo LEN_LOOP
For /F "Delims=" %%i In ('DIR /A:D/B "%$ROOT%\*"^|FindStr /XRC:"%$REG%*"') Do @Echo RD /S/Q "%$ROOT%\%%i"
2. $FILE - файл со списком исключений, $TEMP - временный файл
Код:
@Echo Off
Set $ROOT=C:
Set $FILE=%~dpn0.lst
Set $TEMP=%~dpn0.tmp
DIR /B/A:D "%$ROOT%\*" >"%$TEMP%"
For /F "Delims=" %%i In ('FindStr /IVXG:"%$FILE%" "%$TEMP%"') Do @Echo RD /S/Q "%$ROOT%\%%i"
З.Ы. для отладки перед RD поставил @Echo, перед применением убрать
|
semiono, аналогично предыдущему:
Код:
@Echo Off
Set $ROOT=C:
Set $FILE=%~dpn0.lst
Set $TEMP=%~dpn0.tmp
DIR /B "%$ROOT%\*" >"%$TEMP%"
DIR /B/A:H "%$ROOT%\*" >>"%$TEMP%"
For /F "Delims=" %%i In ('FindStr /IVXG:"%$FILE%" "%$TEMP%"') Do (
If Exist "%$ROOT%\%%i\" (
@Echo RD /S/Q "%$ROOT%\%%i"
) ELSE (
@Echo ATTRIB -H -S "%$ROOT%\%%i"
@Echo DEL /F/Q "%$ROOT%\%%i"
)
)
пример LST-файла:
Код:
~
BOOT.INI
NTDETECT.COM
NTLDR
|
offtop: а что @reg export /? только ключами сейвить? бли, как неудобно!!
а нельзяль хоть как-то отфильтровать потом файл my.reg, или может утиль есть чтоб по конкретно value каждый сейвить избирательно?
ЗЫ ну кто же такие утилиты делает с ограничениями элементарного :\
ай ай, микросовт!
|
ВОПРОС КАК УДАЛИТЬ все %windir%\$NtUninstall~1 через cmd или bat
|
ALIEN7
Код:
RD /S /Q %windir%\$NtUninstall~1
|
semiono,
Цитата:
Цитата semiono
нельзяль хоть как-то отфильтровать потом файл my.reg, или может утиль есть чтоб по конкретно value каждый сейвить избирательно »
|
отфильтровать можно, но геморно - проще сохранить в батник:
Код:
@Echo Off
Set $CMD=.\Reg_Save.CMD
Echo @Echo Off >%$CMD%
Echo CHCP 1251>>%$CMD%
Echo.>>%$CMD%
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "Desktop"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "Favorites"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "My Music"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "My Pictures"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Streams\0" "ViewView2"
EXIT
:SAVE_VAL
Set $N=1
For %%i In (%~2) Do Set /A $N+=1
For /F "Tokens=%$N%* Delims= " %%i In ('REG Query "%~1" /v "%~2"^|FindStr /IBRC:" *%~2 * *REG_"') Do Echo REG ADD "%~1" /v "%~2" /t %%i /d "%%j" /f>>%$CMD%
GoTo :EOF
|
Да, былоб неплохо найти нормальный reg.exe с нормальным экспортом...
А идея хорошая, но мне однако там надо получить именно .reg
И ещё, Ваши возможности CMD меня просто пугают! Я думал CMD вообще ничего не может,
однако
For /F "Tokens=%$N%* Delims= " %%i In ('REG Query "%~1" /v "%~2"^|FindStr /IBRC:" *%~2 * *REG_"') ,\
Do Echo REG ADD "%~1" /v "%~2" /t %%i /d "%%j" /f>>%$CMD%
я даже прочесть не осилю! Крута! :) bash напоминает!
|
использование некоторых управляющих символов ( CMD) в значениях строковых параметров может отрабатываться некорректно (например, двойные кавычки)... хотя, если подойти более скурпулезно, некоторые исключения тоже можно учесть в коде (те же кавычки)
Цитата:
Цитата semiono
мне однако там надо получить именно .reg »
|
попробуй такой вариант:
Код:
@Echo Off
CHCP 1251
Set $REG=%~dpn0.reg
Set $TMP=%~dpn0.tmp
Echo Windows Registry Editor Version 5.00>"%$REG%"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "Desktop"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "Favorites"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "My Music"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Shell Folders" "My Pictures"
Call :SAVE_VAL "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Streams\0" "ViewView2"
EXIT
:SAVE_VAL
REG Query "%~1" /v "%~2" >Nul 2>&1
If ErrorLevel 1 GoTo :EOF
If Exist %$TMP% DEL /F/Q %$TMP%
REG Export "%~1" "%$TMP%" >Nul 2>&1
For /F "Tokens=1 Delims=:" %%i In ('Type "%$TMP%"^|FindStr /IRBNC:^"\"%~2\"^"') Do Set $N=%%i&Set $M=0
For /F "Tokens=1 Delims=:" %%i In ('Type "%$TMP%"^|FindStr /BRNC:^"[[\"]^"') Do If %%i GTR %$N% Set $M=%%i&GoTo SAVE_REG
:SAVE_REG
Echo.>>"%$REG%"
Echo [%~1]>>"%$REG%"
For /F "Tokens=1* Delims=:" %%i In ('Type "%$TMP%"^|FindStr /BRNC:^".^"') Do (
If %%i GEQ %$N% (
If %$M% EQU 0 Echo %%j>>"%$REG%"
If %%i LSS %$M% Echo %%j>>"%$REG%"
)
)
GoTo :EOF
З.Ы. есть недостаток - для каждого параметра выполняется Export и парсинг всей ветки
|
Время: 16:29.
© OSzone.net 2001-