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

Xarien 06-06-2013 15:39 2163343

Перемещение файлов с исключением по пути.
 
Есть Батник по поиску и перемещению определённых типов файлов (по расширению) с системного диска на сетевой диск.
Есть список папок исключения.


HTML код:

@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" (
Exit
)
cacls "Y:\Clean\%USERNAME%" /E /G %USERNAME%@domainname.local:F
cacls "Y:\Clean\%USERNAME%" /E /R domainname\DomainUsers
for /d %%a in (%SystemDrive%\*) do (set "$a=%%a"
 SetLocal EnableDelayedExpansion
if /i not "!$a:~3!"=="Windows" if /i not "!$a:~3!"=="Program Files" if /i not "!$a:~3!"=="Miranda" (
  pushd "!$a!\" && (for /f "delims=" %%A in ('"dir/b/s/a-d *.mp3 *.rar *.zip *bak 2>Nul"') do (
  xcopy /s /y /h /i "%%A" "Y:\Clean\%USERNAME%%%~pA">Nul && del /f /s /q "%%A"

)
  popd))
copy /y %SystemDrive%\*.mp3* Y:\Clean\%USERNAME%
copy /y %SystemDrive%\*.rar* Y:\Clean\%USERNAME%
copy /y %SystemDrive%\*.zip* Y:\Clean\%USERNAME%
copy /y %SystemDrive%\*.bak* Y:\Clean\%USERNAME%
del /q %SystemDrive%\*.mp3  %SystemDrive%\*.rar %SystemDrive%\*.zip %SystemDrive%\*.bak
EndLocal)
%SystemDrive%
cd "%temp%"
del /f /s /q *.*


Проблема в следующем. Исключения по папкам работают только в том случае, если они находятся в корне диска.

Необходимо добавить пару файлов (или вложенных папок с файлами ) в исключения, и если что редактировать bat-ник и дописывать исключения (лучше если это будет делаться прямо в bat файле, а не в отдельном txt с исключениями)

Примеры исключений которые должны работать:
C:\Documents and Settings\All Users\Application Data\Microsoft\OFFICE\DATA\OPA12.bak
C:\Documents and Settings\USERNAME\Local Settings\Application Data\Programs\Opera\skin\standard_skin.zip

Подскажите пожалуйста, как это сделать, что бы не сильно переписывать существующий Bat файл.

Заранее благодарен:)

Xarien 12-06-2013 23:55 2166772

Граждане. Неужели никто не в силах мне помочь? :(

Foreigner 13-06-2013 07:31 2166845

Почитайте справку по xcopy, он умеет исключения.
Код:

xcopy /e "SourcePath" "DestPath\" /exclude:exclude.txt
В exclude.txt пишите ваши исключения -- может быть название файла, часть пути, расширение. Для каждого исключения отдельная строка.
Код:

\OFFICE\DATA\OPA12.bak
\Opera\skin\standard_skin.zip


Xarien 13-06-2013 15:20 2167067

Foreigner, Спасибо. Почти получилось. Проблема в том, что для файлы всё равно удаляются. Они не копируются. Это работает. Но надо, что бы они и не удалялись.

Xarien 13-06-2013 16:16 2167113

Разобрался. Спасибо:)

Хотя остался ещё вопрос. Предполагается читска по всем локальным дискам. не помню метку, к сожалению..
Но.. можно ли как-то отличить флэшку от локального диска срадствами командной строки?

Iska 13-06-2013 16:42 2167134

Если она — съёмное устройство, то можно: Win32_LogicalDisk class (Windows).
Код:

wmic.exe LogicalDisk get Name, DriveType

Xarien 14-06-2013 17:22 2167752

немного не понятно, как исключить её из сканирования ?

Xarien 20-06-2013 07:44 2171049

Благодаря 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 



Время: 17:28.

Время: 17:28.
© OSzone.net 2001-