Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление папок по критериям (http://forum.oszone.net/showthread.php?t=141461)

jentoso 30-05-2009 21:02 1131197

Удаление папок по критериям
 
Помогите с удалением каталогов по следующим критериям:
1. Удаление папки у которой меняется имя состоящее из букв и цифр.
2. Удаление папок кроме определенной (либо определенных)
Эти обе задачи между собой не связаны. Просто решил не создовать несколько тем, а задать в одной.
Спасибо.

mitiya 30-05-2009 23:36 1131332

1. ПРимер имени хоть дайте. Не совсем понятно чего нужно.

2.

что-то вроде :
Код:


for /d %%i in (*) do call :d %%i

:d

if not %1=="имя опредененной папки" rd /s /q %1

goto :eof


jentoso 31-05-2009 09:33 1131457

Цитата:

Цитата mitiya
1. ПРимер имени хоть дайте. Не совсем понятно чего нужно. »

Например с4р3р4е8у2вке. А надо это для того чтобы удалить папку которою оставляет установщик Net Framework 3.5 SP1

mitiya 31-05-2009 12:40 1131555

Я думаю единственный надежный способ ее идентифицировать, это по содержимому.
Т.е. там в папке должен быть хотя бы какой-то файл который точно идентифицирует эту папку как ту что оставляет Net Framework 3.5 SP1.

примерно так:

Код:


for /d %%i in (*) do call :d %%i

:d

IF EXIST %1\имя_файла rd /s /q %1

goto :eof

код не проверял, просто принцип описал.

jentoso 31-05-2009 13:41 1131584

на счет файлов в ней не помню, а вот папки с файлами в ней присутсвуют

jentoso 10-06-2009 14:24 1140079

Цитата:

что-то вроде :

Код:
for /d %%i in (*) do call :d %%i

:d

if not %1=="имя опредененной папки" rd /s /q %1

goto :eof
немного не понятно с этим кодом, он в итоге удалает все с диска. Или вместо * надо указать путь(диск) откуда надо удалять?

Vlad02 10-06-2009 15:01 1140117

Цитата:

Цитата 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

jentoso 10-06-2009 17:41 1140234

Vlad02, задача сформулирована так как она есть на самом деле.
Цитата:

Цитата Vlad02
Почему нельзя стереть по атрибуту времени? (созданный в последний час например?) »

А вдруг за этот час была создана какая-нибудь нужная директория.
По поводу Религии вопрос вообще не уместен.
Цитата:

Цитата Vlad02
А реализация дурацкая в алгоритме может стоило бы учесть, что может быть список запрещённых к стиранию каталогов, а не один каталог? и реализовать через расширенный фор, если нужно именно так? »

В этом нет потребности, но если бы описали то не было лишним.

amel27 11-06-2009 12:42 1140883

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 12-06-2009 15:47 1141696

Пожалуйста, есть вопрос! http://forum.oszone.net/showthread.php?p=1141691
Удаление с исключением?

amel27 12-06-2009 16:57 1141737

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


semiono 15-06-2009 20:19 1144081

offtop: а что @reg export /? только ключами сейвить? бли, как неудобно!!
а нельзяль хоть как-то отфильтровать потом файл my.reg, или может утиль есть чтоб по конкретно value каждый сейвить избирательно?

ЗЫ ну кто же такие утилиты делает с ограничениями элементарного :\
ай ай, микросовт!

ALIEN7 15-06-2009 23:12 1144227

ВОПРОС КАК УДАЛИТЬ все %windir%\$NtUninstall~1 через cmd или bat

Maza Faka 16-06-2009 07:22 1144402

ALIEN7
Код:

RD /S /Q %windir%\$NtUninstall~1

amel27 16-06-2009 08:07 1144408

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


semiono 16-06-2009 16:26 1144805

Да, былоб неплохо найти нормальный 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 напоминает!

amel27 17-06-2009 11:38 1144907

Цитата:

Цитата semiono
идея хорошая»

использование некоторых управляющих символов (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.

Время: 16:29.
© OSzone.net 2001-