Войти

Показать полную графическую версию : [решено] Копирование файлов по дате создания


Страниц : [1] 2

Syna
10-12-2012, 11:59
Здравствуйте, помогите пожалуйста с батником. Нужно следующие:
Батником про сканировать директорию и скопировать по маске файлы (*.xml и *.txt) и дате создания, именно по созданию не по изменению файла.
Все что я сделал, это про сканировал директорию и вывел дату создания, а как ее привязать к файлам не знаю.
Вот скрипт:

@echo off
SetLocal EnableExtensions
setlocal enableDelayedExpansion

FOR /r "D:\Din" %%f IN (*.*) do (
set nm=%%f
@for /f %%i in ('dir "!nm!" /O:D /A:-D /tc ^| findstr "^[0-9]*\."') do set g=%%i

echo %%f [!g!]

)

Заранее, спасибо.

sov44
10-12-2012, 20:54
Syna, так?
@Echo Off
set papka=D:\Din

For /F "delims=" %%a In ('dir /b/s/a-d "%papka%"') Do Echo %%~nxa - %%~ta
pause
exit /b

gora
10-12-2012, 22:15
@Echo Off
SetLocal EnableDelayedExpansion
set folder=e:\Temp 1
For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "%folder%" ^| Findstr /E /c:".txt" /c:".xml"') Do (
Set ta=%%a
Set name=!ta:~36!
Set dat=!ta:~0,10!
Echo !dat! !name!
)
Pause
Exit

Syna
11-12-2012, 07:55
Спасибо, "gora", то что нужно, если не трудно, можешь еще в этот скрипт дописать следующие:
нужно копировать эти файлы только, если они меньше даты создания файла.
Например: файл создан 12.12.2012 его копировать не надо, если файл создан 06.12.2012 его надо уже копировать, т.е. интервал -5 дней.
Еще раз, огромное спасибо.

gora
11-12-2012, 10:57
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp
Set old=5

For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
::Call :formatMM_DD
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%

For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "%folder%" ^| Findstr /E /c:".txt" /c:".xml"') Do (
Set ta=%%a
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Echo Copy !dat! %folder%\!name!) Else Echo Not copy !dat! %folder%\!name!
)
Pause
Exit

:GetOldDate
Set /A DD-=%1
If %DD% GTR 0 GoTo formatMM_DD
Set /A MM=MM+11-((MM+10)/12)*12
If %MM%==12 Set /A YYYY-=1
For /F "Tokens=%MM%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set X=%%i
If %MM%==2 (
Set /A B1=YYYY%%4, B2=YYYY%%100, B3=YYYY%%400
If !B1!==0 If Not !B2!==0 Set /A X+=1
If !B3!==0 Set /A X+=1
)
Set /A DD=DD+X-((DD+X-1)/X)*X
:formatMM_DD
Set MM=0%MM%&Set DD=0%DD%
Set MM=%MM:~-2%&Set DD=%DD:~-2%
GoTo :EOF

Syna
11-12-2012, 12:40
Спасибо, огромное, gora. Выручил. Респект тебе. :clapping:

Syna
12-12-2012, 07:12
Сегодня только толком просмотрел батник, прошу прощения за тупой вопрос. Скажи, пожалуйста, какую переменную брать для копирования старых файлов? Спасибо.

gora
12-12-2012, 08:17
Напишите в этой строке путь для копирования (Вы его не указали в первом сообщении):
If %YYYY%%MM%%DD% GTR !dat! (Copy "%folder%\!name!" "Path for old files")

Syna
12-12-2012, 09:22
.Напишите в этой строке путь для копирования (Вы его не указали в первом сообщении):
Код:
If %YYYY%%MM%%DD% GTR !dat! (Copy "%folder%\!name!" "Path for old files") »

Выдает такую ошибку:
Now 12 12 2012
Old 07 12 2012
Непредвиденное появление: /12)*12

If %YYYY%%MM%%DD% GTR !dat! (Copy "%folder%\!name!" "%folder1%")

gora
12-12-2012, 11:09
Выдает такую ошибку:
Now 12 12 2012
Old 07 12 2012
Непредвиденное появление: /12)*12 »
1 Укажите полное название Вашей ОС и ее разрядность.
2 Попробуйте еще раз скопировать скрипт из поста 5 и не меняйте в нем ни чего кроме строки Set folder=e:\Temp в которой укажите путь к Вашей папке.
3 Приведите здесь путь к этой папке.
4 Покажите вывод скрипта здесь в тегах code
5 Если скрипт продолжает выдавать ошибку, то повторите пп 2-4 для скрипта из поста 3.
6 Приведите значение переменной "%folder1%"
7 Проверьте Ваши пути и имена обрабатываемых файлов на отсутствие спец. символов в них.

Syna
12-12-2012, 11:32
Отображается все как надо, а вот кода меня строку выдает ошибку (Непредвиденное появление: /12)*12 »).

1. Windows 7 Pro x32
2.
Now 12 12 2012
Old 07 12 2012
Not copy 20121212 D:\11\iperf.exe
Not copy 20121212 D:\11\log.txt
Для продолжения нажмите любую клавишу....

3.Откуда - Set folder=D:\11
куда- Set folder1=D:\22

КОД:
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=D:\11
Set folder1=D:\22
Set old=5

For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
::Call :formatMM_DD
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%

For /F "delims=" %%a In ('dir /s /A:-D /T:C /O:D "%folder%" ^| Findstr /E /c:".txt" /c:".exe"') Do (
Set ta=%%a
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Copy %folder%\!name! %folder1%)

pause
exit
:GetOldDate
Set /A DD-=%1
If %DD% GTR 0 GoTo formatMM_DD
Set /A MM=MM+11-((MM+10)/12)*12
If %MM%==12 Set /A YYYY-=1
For /F "Tokens=%MM%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set X=%%i
If %MM%==2 (
Set /A B1=YYYY%%4, B2=YYYY%%100, B3=YYYY%%400
If !B1!==0 If Not !B2!==0 Set /A X+=1
If !B3!==0 Set /A X+=1
)
Set /A DD=DD+X-((DD+X-1)/X)*X
:formatMM_DD
Set MM=0%MM%&Set DD=0%DD%
Set MM=%MM:~-2%&Set DD=%DD:~-2%
GoTo :EOF

gora
12-12-2012, 12:00
For /F "delims=" %%a In ('dir /s /A:-D /T:C /O:D "%folder%" ^| Findstr /E /c:".txt" /c:".exe"') Do ( »
Вы добавили рекурсию и ни чего об этом не сказали. В первом посте про нее тоже нет ни слова. С этим ключом вывод Dir меняется и парсер вывода может неправильно работать, если одна из вложенных папок будет кончаться на .txt или на .exe
Удалите этот ключ или избавляйтесь от таких папок при обработке, первое предпочтительнее.

Syna
12-12-2012, 12:42
а как сделать чтобы он искал в под папках тоже?

gora
12-12-2012, 13:29
Syna, встречный вопрос: что Вы собираетесь делать, если в подпапках встретятся одноименные файлы? Копировать их с перезаписью или опять будет новая вводная? :dont-know

@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp\3 3
Set folder1=e:\Temp\222
Set old=5

For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%

For /R "%folder%" %%s In (.) Do (
Set ts=%%s
Set sub=!ts:~0,-2!
For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "!sub!" 2^>Nul ^| Findstr /E /c:".txt" /c:".exe"') Do (
Set ta=%%a
If Not "!ta:~0,1!"==" " (
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Echo Copy !dat! !sub!\!name!) Else Echo Not copy !dat! !sub!\!name!
)
)
)
Pause
Exit

:GetOldDate
Set /A DD-=%1
If %DD% GTR 0 GoTo formatMM_DD
Set /A MM=MM+11-((MM+10)/12)*12
If %MM%==12 Set /A YYYY-=1
For /F "Tokens=%MM%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set X=%%i
If %MM%==2 (
Set /A B1=YYYY%%4, B2=YYYY%%100, B3=YYYY%%400
If !B1!==0 If Not !B2!==0 Set /A X+=1
If !B3!==0 Set /A X+=1
)
Set /A DD=DD+X-((DD+X-1)/X)*X
:formatMM_DD
Set MM=0%MM%&Set DD=0%DD%
Set MM=%MM:~-2%&Set DD=%DD:~-2%
GoTo :EOF

Syna
12-12-2012, 13:37
Копировать их с перезаписью.

Все, вроде работает, так как надо. Спасибо, за помощь и терпение. :) :up

Syna
13-12-2012, 12:08
Здравствуйте, gora. Тут возникла еще одна необходимость в этом скрипте.
например- в папке folder есть еще одна папка, назовем ее log, так вот нужно что бы при сканировании, если есть файлы с расширением, которые у нас указанны в скрипте выше - не копировались. т.е. простым языком не проверялась папка log вообще.
Если есть возможность, помоги плиз.
Спасибо.

gora
13-12-2012, 18:38
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp 1\222
Set folder1=e:\Temp 1\2
Set old=5
Set exc=log

For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%

For /R "%folder%" %%s In (.) Do (
Set ts=%%s
Set sub=!ts:~0,-2!
rem Echo == %%~nxs == !sub! ==
If Not "%%~nxs"=="%exc%" If "!sub!"=="!sub:\%exc%\=!" (
For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "!sub!" 2^>Nul ^| Findstr /E /c:".txt" /c:".exe"') Do (
Set ta=%%a
If Not "!ta:~0,1!"==" " (
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Echo Copy !dat! !sub!\!name!) Else Echo Not copy !dat! !sub!\!name!
)
)
)
)
Pause
Exit

:GetOldDate
Set /A DD-=%1
If %DD% GTR 0 GoTo formatMM_DD
Set /A MM=MM+11-((MM+10)/12)*12
If %MM%==12 Set /A YYYY-=1
For /F "Tokens=%MM%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set X=%%i
If %MM%==2 (
Set /A B1=YYYY%%4, B2=YYYY%%100, B3=YYYY%%400
If !B1!==0 If Not !B2!==0 Set /A X+=1
If !B3!==0 Set /A X+=1
)
Set /A DD=DD+X-((DD+X-1)/X)*X
:formatMM_DD
Set MM=0%MM%&Set DD=0%DD%
Set MM=%MM:~-2%&Set DD=%DD:~-2%
GoTo :EOF

Syna
14-12-2012, 05:47
Спасибо, большое.

Syna
24-12-2012, 05:03
Здравствуйте, возникла еще одна проблемка, нужно в этом коде еще добавить в исключение файлы что бы они не копировались.
Например: файл qwe00001.txt, в файле меняются только первые три буквы, т.е. не нужно копировать файлы по маске "*00001.txt"
Спасибо.

Код:
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp 1\222
Set folder1=e:\Temp 1\2
Set old=5
Set exc=log
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%
For /R "%folder%" %%s In (.) Do (
Set ts=%%s
Set sub=!ts:~0,-2!
rem Echo == %%~nxs == !sub! ==
If Not "%%~nxs"=="%exc%" If "!sub!"=="!sub:\%exc%\=!" (
For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "!sub!" 2^>Nul ^| Findstr /E /c:".txt" /c:".exe"') Do (
Set ta=%%a
If Not "!ta:~0,1!"==" " (
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Echo Copy !dat! !sub!\!name!) Else Echo Not copy !dat! !sub!\!name!
)
)
)
)
Pause
Exit
:GetOldDate
Set /A DD-=%1
If %DD% GTR 0 GoTo formatMM_DD
Set /A MM=MM+11-((MM+10)/12)*12
If %MM%==12 Set /A YYYY-=1
For /F "Tokens=%MM%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set X=%%i
If %MM%==2 (
Set /A B1=YYYY%%4, B2=YYYY%%100, B3=YYYY%%400
If !B1!==0 If Not !B2!==0 Set /A X+=1
If !B3!==0 Set /A X+=1
)
Set /A DD=DD+X-((DD+X-1)/X)*X
:formatMM_DD
Set MM=0%MM%&Set DD=0%DD%
Set MM=%MM:~-2%&Set DD=%DD:~-2%
GoTo :EOF
-------
Мои аддоны | Dropbox »

gora
24-12-2012, 09:36
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=e:\Temp\3 3
Set folder1=e:\Temp\222
Set old=5
:: не обрабатывать папки log любой глубины вложения
Set exc=log
:: не обрабатывать файлы оканчивающиеся на 00001.txt (проверка последних 9 символов имени и расширения файла)
Set n=9
Set excFile=00001.txt

For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set tim=%%i
Set YYYY=%tim:~0,4%&Set MM=%tim:~4,2%&Set DD=%tim:~6,2%
Echo Now %DD% %MM% %YYYY%
Call :GetOldDate %old%
Echo Old %DD% %MM% %YYYY%

For /R "%folder%" %%s In (.) Do (
Set ts=%%s
Set sub=!ts:~0,-2!
If /I Not "%%~nxs"=="%exc%" If /I "!sub!"=="!sub:\%exc%\=!" (
For /F "delims=" %%a In ('dir /A:-D /T:C /O:D "!sub!" 2^>Nul ^| Findstr /I /E /c:".txt" /c:".exe"') Do (
Set ta=%%a
If Not "!ta:~0,1!"==" " If /I Not "!ta:~-%n%!"=="%excFile%" (
Set name=!ta:~36!& Set dat=!ta:~6,4!!ta:~3,2!!ta:~0,2!
If %YYYY%%MM%%DD% GTR !dat! (Echo Copy !dat! !sub!\!name!) Else Echo Not copy !dat! !sub!\!name!
)
)
)
)
Pause
Exit




© OSzone.net 2001-2012