Компьютерный форум 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=262385)

Rudeboy 13-06-2013 13:06 2166980

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

Iska 13-06-2013 13:23 2166990

Что Вы понимаете под «системными папками и файлами»?

Rudeboy 13-06-2013 13:39 2167010

Цитата:

Цитата Iska
Что Вы понимаете под «системными папками и файлами»? »

Windows Users Program Files и (x86)

Iska 13-06-2013 15:53 2167086

То есть:
Код:

$Recycle.Bin
"Documents and Settings"
ProgramData
Recovery
"System Volume Information"

и файлы в корневом разделе удаляем (ну, ладно — пытаемся удалить ;))? А после идём в раздел Microsoft Windows 7 и жалуемся?

Цель Ваша глобальная какова?

Rudeboy 14-06-2013 02:48 2167415

Цитата:

Цитата Iska
Цель Ваша глобальная какова? »

Цель - при открытии двери офиса ненужными людьми быстро подчистить диски. оставить систему с программной составляющей.

Iska 14-06-2013 04:34 2167420

Rudeboy, если под «ненужными людьми» подразумеваются люди из управления «К» — то сие не поможет. Разве что Программа SDelete (версия 1.6.1) и ей подобные. Но для их работы нужно время.

Foreigner 14-06-2013 07:09 2167430

Цитата:

Цитата Rudeboy
Цель - при открытии двери офиса ненужными людьми быстро подчистить диски »


Для этого вся работа должна храниться на сетевом диске, а специально обученные помощники админа изымать винчестеры по секундомеру.

Xarien 14-06-2013 17:05 2167744

Я с похожим вопросом обращался. У меня кстати исключения работают, но толкьо если папки в корне диска.

Добрые люди с форума подсказали, как можно поиному сделать список исключений.
И батник вроде работает.

PHP код:

@echo on

Set Otkuda
=c:


Set NoDelete=C:cleanexclude.txt
@Echo %>%NoDelete%

@Echo 
555 >>%NoDelete%


FOR /
"usebackq delims=" %%f IN (`xcopy /y /h /i "%Otkuda%\*.aaa" Y:\Clean\%USERNAME% /L /S /EXCLUDE:%NoDelete%`) DO Del "%%f"
pause 


В Eclude.txt написано

\555\

Тоесть, из сканирования исключена папка 555 и всё вложенные папки. опять таки это я для примера.


Есть только несколько проблем.
1. Файлы почему-то не копируются. (только удаляются, а надо что бы копировались с сохранением структуры папок)
2. Не знаю как сделать такой поиск по всем локальным дискам (исключая флэшки если они вставлены)
3. Как перечислить побольше масок файлов? *.aaa стоит для примера. А надо *.aaa, *.bbb, *.ссс и т.дт

Foreigner 14-06-2013 18:04 2167766

Xarien:
Цитата:

а надо что бы копировались с сохранением структуры папок
у xcopy ключи /e или /s в зависимости от задачи

Цитата:

Не знаю как сделать такой поиск по всем локальным дискам (исключая флэшки если они вставлены)
Код:

@echo off
setlocal

set "wmic=wmic logicaldisk where drivetype!="2" get name"

for /f %%i in (' "%wmic%" ') do if exist %%i echo do something with drive %%i

Цитата:

Как перечислить побольше масок файлов? *.aaa стоит для примера. А надо *.aaa, *.bbb, *.ссс и т.дт
Можно завернуть в еще один цикл:
Код:

for %%i in (.aaa .bbb .ccc) do (

    for /f ... %%j in ('xcopy .... *%%i ....) do del "%%j"

)


Xarien 18-06-2013 12:31 2169805

Всё равно не копирует. Удалять удаляет, с исключениями, как надо, но не копируует перед этим. В итоге папка Y:\Clean\%USERNAME% пуста.



PHP код:

@echo on

MD Y
:Clean%USERNAME%
If 
Not Exist "Y:\Clean" (
Echo 
Otsutstvet Setevoi DiskY:Clean
Exit


setlocal

set wmic
=wmic logicaldisk where drivetype="3" get name

Set NoDelete
=C:cleanexclude.txt
@Echo %>%NoDelete%

@Echo 
OFFICE >>%NoDelete%
@Echo 
Windows >>%NoDelete%
@Echo 
Program Files >>%NoDelete%
@Echo 
Program Files (x86) >>%NoDelete%

for /
%%i in (' "%wmic%" ') do if exist %%(

for %%
j in (.aaa .bbb .ccc) do (
FOR /
"usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i\*%%j" "Y:\Clean\%USERNAME%" /L /EXCLUDE:%NoDelete%`) DO Del "%%f"
)



Пытался вставить отдельно строку c xcopy (Но не понятно почему не работает вышеуказанный код:(...)

PHP код:

for /%%i in (' "%wmic%" ') do if exist %%(

for %%
j in (.aaa .bbb .ccc) do FOR /"usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i\*%%j" "Y:\Clean\%USERNAME%\%%i"`) do (

FOR /
"usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i\*%%j" "Y:\Clean\%USERNAME%" /L /EXCLUDE:%NoDelete%`) DO Del "%%f"
)
)
pause 


Но это ооочень уж длительный процесс.


Такая процедура значительно быстрее отрабатывала поиск и копирование файлов. (но по правде говоря я совсем не понимаю, почему она намного быстрее всё это делает.)

PHP код:

for /%%a in (%SystemDrive%*) do (set "$a=%%a"
 
SetLocal EnableDelayedExpansion
if /i not "!$a:~3!"=="Program Files (x86)" if /i not "!$a:~3!"=="Windows"  (
  
pushd "!$a!\" && (for /f "delims=" %%A in ('"dir/b/s/a-*.aaa *.bbb *.ccc 2>Nul"') do (
  xcopy /s /y /h /i "
%%A" "Y:Clean%USERNAME%%%~pA">Nul && del /f /s /q "%%A"

)
  popd)) 

И я бы использовал этот код для копирования, но не получается указать в нём поиск на всех локальных дисках, определяемых выше, как в коде ниже. (при этом не затрагивая флэшки и сетевые диски)


PHP код:

set wmic=wmic logicaldisk where drivetype="3" get name

for /%%i in (' "%wmic%" ') do if exist %%(
for /
%%a in (%%i) do (set "$a=%%a"
 
SetLocal EnableDelayedExpansion
if /i not "!$a:~3!"=="Program Files (x86)" if /i not "!$a:~3!"=="Windows"  (
  
pushd "!$a!\" && (for /f "delims=" %%A in ('"dir/b/s/a-*.aaa *.bbb *.ccc 2>Nul"') do (
  xcopy /s /y /h /i "
%%A" "Y:Clean%USERNAME%%%~pA">Nul && del /f /s /q "%%A"

)
  popd)) 


Я уже совсем запутался.

Foreigner 18-06-2013 19:17 2170212

Код:

@echo off
setlocal

set "wmic=wmic logicaldisk where drivetype=3 get name /value"

:: Определяем локальные диски
for /f "tokens=2 delims==" %%i in (' "%wmic%" ') do call:1 %%i\

:: Что-то делаем со список папок из корня каждого локального диска
for /f "tokens=2 delims==" %%i in (' set folder_ ') do (
   
    echo xcopy /s /y /h /i "%%i\*.aaa" "C:\Clean\%%~nxi\"
    echo xcopy /s /y /h /i "%%i\*.bbb" "C:\Clean\%%~nxi\"
    echo del /s "%%i\*.aaa"
    echo del /s "%%i\*.bbb"
    echo и т.д. и т.п.

)

goto:eof

:1

pushd %1

:: Исключаем из корня диска скрытые и системные папки
for /f "tokens=*" %%i in ('dir /b /ad-s-h') do set "folder_%1%%~snxi=%%~fi"

:: А так же те, что не нужны (короткие имена)
for %%i in (PROGRA~1,PROGRA~2,Windows,Users,MUSIC) do set "folder_%1%%i="

popd


Xarien 19-06-2013 15:36 2170690

Foreigner, Всё отлчно. Остался один малюююсенький нюансик.

Нужно, что бы в папку, в которую всё копируется, создавались папки, с именами дисков, с которых копируется соотвественно.

(С, D, E).

В предыдущем батнике я дописывал %%i к пути (C:\Clean\%username%\%%i) .
А здесь пишет - Недопустимый путь.

Foreigner 19-06-2013 16:54 2170734

Цитата:

Цитата Xarien
Нужно, что бы в папку, в которую всё копируется, создавались папки, с именами дисков, с которых копируется соотвественно. »

Изменяем этот цикл:
Код:

...

for /f "tokens=2,3 delims=_:=" %%i in (' set folder_ ') do (
   
    xcopy /s /y /h /i "%%j\*.aaa" "C:\Clean\%%i\%%~nxj\"
    xcopy /s /y /h /i "%%j\*.bbb" "C:\Clean\%%i\%%~nxj\"
    del /s "%%j\*.aaa"
    del /s "%%j\*.bbb"

)

...


Xarien 19-06-2013 19:18 2170852

Создатся только папка с диском С. Причём имена стали короткими. Но беда даже не в этом.
Корень диска тоже не чиститься.
Я понимаю, что всех уже достал. Но в такие cmd дебри залез впервые. А написать нужно быстро. Начальство над душой стоит.
:(:(
PHP код:

@echo on


setlocal

set 
"wmic=wmic logicaldisk where drivetype="3" get name"

Set NoDelete=C:exclude.txt
@Echo %>%NoDelete%

@Echo 
OFFICE >>%NoDelete%
@Echo 
Windows >>%NoDelete%
@Echo 
skin >>%NoDelete%
@Echo 
Program Files >>%NoDelete%
@Echo 
Program Files (x86) >>%NoDelete%

@Echo 
totalcmd >>%NoDelete%

for /
%%i in (' "%wmic%" ') do if exist %%(

for %%
j in (.aaa .bbb .ccc .ddd .xxx .yyy .jjj) do (
FOR /
"usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i\*%%j" "Y:\Clean\%USERNAME%\%%i"`) do (

FOR /
"usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i\*%%j" "Y:\Clean\%USERNAME%" /L /EXCLUDE:%NoDelete%`) DO Del "%%f"
)
)


Причём этот батник, вроде работает так как надо. И из корня диска удаляет, и со списком исключений работает, даже исключает вложенные папки.
Но занимает это часа полтора.

Ваш Батник отрабатывает в мнгновения. (Как так получается что он одновременно ищет и *.aaa, и *.bbb - мой сначала гоняет по всему диску в поисках *.aaa, потом *.bbb ???) Но всё же проблема с созданием папок с именами дисков, и перемещением файлов из корня дисков.:(

Пиво, коньяки... . Лишь бы начальство отпустило меня с миром, по этому вопросу.

Foreigner 19-06-2013 20:20 2170892

Вот полный вариант, что бы не путаться. С исправлением замечаний по поводу файлов в корне и ошибки при создании папок:
читать дальше »

Код:

@echo off
setlocal

set "wmic=wmic logicaldisk where drivetype=3 get name /value"

:: Определяем локальные диски
for /f "tokens=2 delims==" %%i in (' "%wmic%" ') do call:1 %%i\

:: Что-то делаем со список папок из корня каждого локального диска
for /f "tokens=2,5 delims=?:=" %%i in (' set folder? ') do (
   
    echo xcopy /s /y /h /i "%%i:%%j\*.aaa" "C:\Clean\%%i\%%~nxj\"
    echo xcopy /s /y /h /i "%%i:%%j\*.bbb" "C:\Clean\%%i\%%~nxj\"
    echo del /s "%%i:%%j\*.aaa"
    echo del /s "%%i:%%j\*.bbb"


)

goto:eof

:1

pushd %1

:: Исключаем из корня диска скрытые и системные папки
for /f "tokens=*" %%i in ('dir /b /ad-s-h') do set "folder?%1%%~snxi=%%~fi"

:: А так же те папки, которые надо исключить (их указывать короткими именами)
for %%i in (PROGRA~1,PROGRA~2,Windows,Users,MUSIC) do set "folder?%1%%i="

:: Копируем/удаляем файлы из корня локальных дисков
for /f "tokens=1 delims=:" %%i in ("%1") do (

    echo xcopy /y /h /i *.aaa "C:\Clean\%%i\"
    echo xcopy /y /h /i *.bbb "C:\Clean\%%i\"
    echo del *.aaa
    echo del *.bbb

)

popd

ЗЫ. Заменил в названии переменных "_" на "?" на случай если существуют папки, где в названии присутствует "_"

Xarien 20-06-2013 01:20 2171004

ПРЕВОСХОДНО!!!!! Вы Великий человек, Foreigner,
Правда исключения не работали на вложенных папках, но я чутка скрестил два кода. По индийски получилось, но главное работает и ооооочень быстро!!!!

Огромное Вам спасибо! Если живёте в Беларуси - поставлю коньяк!
PHP код:

@echo on
del 
%SystemDrive%*.tmp ///q
ping 
-n 5 127.0.0.1 NUL
ping 
-n 5 127.0.0.1 NUL
ping 
-n 5 127.0.0.1 NUL
MD Y
:Clean%USERNAME%
If 
Not Exist "Y:\Clean" (
Echo 
Otsutstvet Setevoi DiskY:Clean

del c
:exclude.txt
del 
%0
pause
&Exit

cacls "Y:\Clean\%USERNAME%" //%USERNAME%@domainname.com:F
cacls 
"Y:\Clean\%USERNAME%" //R domainnamedomainUsers
setlocal

set 
"wmic=wmic logicaldisk where drivetype=3 get name /value"

:: Определяем локальные диски
for /"tokens=2 delims==" %%i in (' "%wmic%" ') do call:%%i

:: Что-то делаем со список папок из корня каждого локального диска
for /"tokens=2,5 delims=?:=" %%i in (' set folder? ') do (
    
    
xcopy ////"%%i:%%j\*.aaa" "Y:\Clean\%USERNAME%\%%i\%%~nxj\"
    xcopy /s /y /h /i "
%%i:%%j*.bbb" "Y:Clean%USERNAME%%%i%%~nxj"
    echo del /s "
%%i:%%j*.aaa"
    echo del /s "
%%i:%%j*.bbb"



)

setlocal

set "
wmic=wmic logicaldisk where drivetype="3" get name"

Set NoDelete=C:\exclude.txt
@Echo %0 >%NoDelete%

@Echo \OFFICE\ >>%NoDelete%
@Echo \Windows\ >>%NoDelete%
@Echo \skin\ >>%NoDelete%
@Echo \Program Files\ >>%NoDelete%
@Echo \Program Files (x86)\ >>%NoDelete%
@Echo \totalcmd\ >>%NoDelete%

for /f %%i in (' "
%wmic%" ') do if exist %%i (

for %%j in (.aaa .bbb .ccc .ddd .xxx .yyy .jjj) do (

FOR /F "
usebackq delims=" %%f IN (`xcopy /s /y /h /i "%%i*%%j" "Y:Clean%USERNAME%" /L /EXCLUDE:%NoDelete%`) DO Del "%%f"
)
)

goto:eof

:1

pushd %1

:: Исключаем из корня диска скрытые и системные папки
for /f "
tokens=*" %%i in ('dir /b /ad-s-h') do set "folder?%1%%~snxi=%%~fi"

:: А так же те папки, которые надо исключить (их указывать короткими именами)
for %%i in (PROGRA~1,PROGRA~2,Windows,Users,MUSIC) do set "
folder?%1%%i="

:: Копируем/удаляем файлы из корня локальных дисков
for /f "
tokens=1 delims=:" %%i in ("%1") do (

    xcopy /y /h /i *.aaa "
Y:Clean%USERNAME%%%i"
    xcopy /y /h /i *.bbb "
C:Clean%USERNAME%%%i"
    echo del *.aaa
    echo del *.bbb

)

popd 

Было бы здорово если бы Батник мог распознавать криптованные диски, и не чистить их)))) Но это не важно.


Время: 06:41.

Время: 06:41.
© OSzone.net 2001-