CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Ответить
 • Просмотры: 1
Аватара пользователя
Xarien

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Xarien »

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

Изображение







PHP код:

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

@echo on

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

setlocal

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

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

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

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

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








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





PHP код:

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

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

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

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








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





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





PHP код:

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

for /d %%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-d *.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 /f %%i in (' "%wmic%" ') do if exist %%i (
for /d %%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-d *.aaa *.bbb *.ccc 2>Nul"') do (
  xcopy /s /y /h /i "%%A" "Y:Clean%USERNAME%%%~pA">Nul && del /f /s /q "%%A"

)
  popd)) 








Я уже совсем запутался.
Аватара пользователя
Xarien

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Xarien »

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



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



(С, D, E).



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

А здесь пишет - Недопустимый путь.
Аватара пользователя
Xarien

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Xarien »

Цитата Xarien:



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




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



Код:

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

...
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

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Xarien »

Создатся только папка с диском С. Причём имена стали короткими. Но беда даже не в этом.

Корень диска тоже не чиститься.

Я понимаю, что всех уже достал. Но в такие cmd дебри залез впервые. А написать нужно быстро. Начальство над душой стоит.

ИзображениеИзображение



PHP код:

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

@echo on





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%\%%i"`) do (



FOR /F "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

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Foreigner »

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


читать дальше »






Код:

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

@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

Re: CMD/BAT - Очистка содержимого дисков не затрагивая папки ОС

Сообщение Xarien »

ПРЕВОСХОДНО!!!!! Вы Великий человек, Foreigner,

Правда исключения не работали на вложенных папках, но я чутка скрестил два кода. По индийски получилось, но главное работает и ооооочень быстро!!!!



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



PHP код:

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

@echo on

del %SystemDrive%*.tmp /f /s /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 Disk: Y:Clean



del c:exclude.txt

del %0

pause&Exit

) 

cacls "Y:\Clean\%USERNAME%" /E /G %USERNAME%@domainname.com:F

cacls "Y:\Clean\%USERNAME%" /E /R domainnamedomainUsers

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 (

    

    xcopy /s /y /h /i "%%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 






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

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