Показать полную графическую версию : [решено] Перенос файлов из папки в папку по дате создания
valedol_z@vk
14-05-2020, 14:36
Доброго времени, подскажите с кодом:
Задача, в папке C:\In\ есть много папок с файлами, необходимо перенести папки с файлами старше 14 дней в папку C:\Old\
Нашёл два скрипта: один просто переносит всё из папки 1 в папку 2, он рабочий:
@echo off
set In=D:\0\1
set Out=D:\0\2
echo %%j
:start
for /f "delims=" %%a in ('dir "%In%\*.*" /b/s 2^>nul') do move /y "%%a" "%Out%"
А второй код просто копирует файлы, но не папки старше 5 дней, пытался поправить под свои нужды но не хватает соображалки.
@Echo Off
SetLocal EnableDelayedExpansion
Set folder=D:\0\1
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
Перенос файлов из папки в папку по дате создания »
второй код просто копирует файлы, но не папки »
если нужны именно файлы, то что делать если в папке будут файлы не входящие в диапазон (папки с файлами старше 14 дней), не трогать такую папку или выбирать оттуда необходимые файлы, создавать в новом месте папку с таким же именем и помещать их туда, но при таком действии подозреваю дата создания поменяется на текущую.
или дата относится все же к папке и надо переносить папку с места на место, но и в таком случае ее дата создания изменится на текущую, хотя может это и неважно, это не указано пока нигде.
megaloman
14-05-2020, 20:34
@Echo Off
cls
Set /A DeltaDay=-14
Set "BoxIn=D:\Box_In\*.*"
Set "BoxOut=D:\Box_Arc"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d" &Call Set "@Tdate=%%@Tdate:~6,2%%.%%@Tdate:~4,2%%.%%@Tdate:~0,4%%"
Call :FromDate -14 %@Tdate% "yyyymmdd"
Del "%BoxIn%\desktop.ini" /S /A
Pushd "%BoxOut%" &&(
>"Exclude.tmp" Xcopy "%BoxIn%" "%BoxOut%" /D:%yyyymmdd:~4,2%-%yyyymmdd:~6,2%-%yyyymmdd:~0,4% /S /Y /L
For /F "usebackq delims=" %%f In (`Xcopy "%BoxIn%" "%BoxOut%" /S /Y /F /EXCLUDE:Exclude.tmp`) Do (
Set "Out=%%f"
Call :ReMove "%%Out: -> =" "%%"
)
Del "%BoxOut%\Exclude.tmp"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /S /B /A:D ^|Sort /R`) DO 2>nul Rd "%%d"
)
pause
Exit /B
:ReMove
If Exist "%~2" Del %1
Exit /B
:FromDate
rem Пересчет даты на заданное кол-во дней
rem В первом аргументе +- дни
rem Во втором аргументе дата в формате dd.mm.yyyy
rem В третем аргументе имя переменной в кавычках где получим новую дату в формате yyyymmdd
rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd"
rem результат в перемменной %yyyymmdd%
SetLocal
Set "DT=%~2"
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set "%~3=%yyyy%%mm:~-2%%dd:~-2%"
GoTo :Eof
valedol_z@vk
19-05-2020, 08:12
если нужны именно файлы, то что делать если в папке будут файлы не входящие в диапазон (папки с файлами старше 14 дней), не трогать такую папку или выбирать оттуда необходимые файлы, создавать в новом месте папку с таким же именем и помещать их туда, но при таком действии подозреваю дата создания поменяется на текущую.
или дата относится все же к папке и надо переносить папку с места на место, но и в таком случае ее дата создания изменится на текущую, хотя может это и неважно, это не указано пока нигде. »
Папки переносятся вместе с файлами,
Есть папка 1 в ней папки с файлами, и просто файлы, необходимо все папки и файлы старше 14 дней перенести из этой папки в папку 2. Если в папке будут файлы не входящие в диапазон, то оставлять.
valedol_z@vk,
т.е. если в подпапке1: "C:\1\подпапка1" будет 10 файлов старше 14 дней и хотя бы один файл менее 14, то такую папку ("C:\1\подпапка1") уже не трогаем, так?
Если в папке будут файлы не входящие в диапазон, то оставлять »
кстати что по коду megaloman, пробовали, легче будет понять что вам надо.
valedol_z@vk
20-05-2020, 07:42
т.е. если в подпапке1: "C:\1\подпапка1" будет 10 файлов старше 14 дней и хотя бы один файл менее 14, то такую папку ("C:\1\подпапка1") уже не трогаем, так? »
Да всё верно, в папке может быть файл который правили вот недавно значит он ещё нужен.
По поводу megaloman , файлы он перекинул вместе с папками, но папки оставил. скорее всего из-за того что я их туда перенёс раньше, хотя дата создания показывает старое число.
megaloman
20-05-2020, 07:52
valedol_z@vk, папки оставил - значит, они не пустые. Остались файлы, не входящие в указанный диапазон по дате изменения, либо подпапки, либо они чем-то заняты, например, открыты другой программой (например, total comander, far). Пустые папки должны были удалиться. Скрипт никак не анализирует даты создания/изменения папок, только дату изменения файлов. Что не устраивает?
valedol_z@vk
20-05-2020, 08:09
Там остались файлы desktop.ini они создались после отработки bat файла.
valedol_z@vk
20-05-2020, 08:13
Вот оставшийся файл
megaloman
20-05-2020, 08:13
desktop.ini они создались после отработки bat файла. После отработки bat файла desktop.ini не создаются, они там были до того
valedol_z@vk
20-05-2020, 08:20
Ага, всё увидел, спасибо большое. теперь дождаться когда папки с файлами станут старыми )))
megaloman
20-05-2020, 09:44
valedol_z@vk, Убейте их! Я добавил в свой код (http://forum.oszone.net/post-2921161-3.html)строку
Del "%BoxIn%\desktop.ini" /S /A
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.