PDA

Показать полную графическую версию : Копировать файлы из одной папки в другую с помощью XCOPY


Sargezzz
13-08-2018, 13:55
Здравствуйте,

использую команду xcopy /s /y /d:%DATE:~3,2%-%DATE:~,2%-%DATE:~6,4% "путь откуда" "путь куда". Данная команда копирует все файлы, которые были модифицированы сегодняшним днем.

Подскажите, пожалуйста, как мне написать данную команду, чтобы копировались все файлы, дата изменения которых больше 7 дней, те сегодня 13.08
файл1 изменен 05.08
файл2 изменен 07.08

батник должен скопировать только файл1. файл2 нет.

Заранее благодарен всем откликнувшимся за помощь.

alpap
13-08-2018, 14:30
forfiles /?

Sargezzz
13-08-2018, 15:12
alpap, а каким образом можно в командной строке высчитать дату по формуле: ТекДата - 7 дней ?
заранее спасибо

megaloman
13-08-2018, 15:30
а каким образом можно в командной строке высчитать дату по формуле: ТекДата - 7 дней »и что делалось, то и будет делаться, и нет ничего нового под солнцем.@Echo Off
cls

Set "DeltaDay=-7"
Call :FromDate %DeltaDay% %Date% "yyyymmdd"
Echo %Date% %DeltaDay% %yyyymmdd%

pause
GoTo :Eof

: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

megaloman
13-08-2018, 16:14
Sargezzz, @Echo Off
cls
FOR /F "tokens=1,2,3 delims=. " %%i IN ("%Date%") DO Set /A D1=1%%i-100, M1=1%%j-100, Y1=%%k
Call :JulianDay %D1% %M1% %Y1% "ND1"

Pushd "Z:\Box_In"
FOR /F "usebackq delims=" %%i IN (`2^>nul Dir /B /A:-D "list.txt"`) DO Set "Date2=%%~ti"
Popd

FOR /F "tokens=1,2,3 delims=. " %%i IN ("%Date2%") DO Set /A D2=1%%i-100, M2=1%%j-100, Y2=%%k
Call :JulianDay %D2% %M2% %Y2% "ND2"

Set /A ND=%ND1%-%ND2%
Echo (%Date%)-(%Date2%)=%ND1%-%ND2%=%ND%
Pause
GoTo :Eof

rem Вычисляет абсолютный номер дня по юлианскому календарю
rem На входе dd mm yyyy
rem На выходе имя переменной в кавычках четвёртым аргументом

:JulianDay
Set /A %~4=(1461*(%3+4800+(%2-14)/12))/4+(367*(%2-2-12*((%2-14)/12)))/12-(3*((%3+4900+(%2-14)/12)/100))/4+%1-32075
exit /bДата в системе в виде дд.мм.гггг

alpap
13-08-2018, 16:17
высчитать дату по формуле: ТекДата - 7 дней ? »
для чего ее высчитывать?
@echo off
cd /d "C:\papka"
for /f "delims=" %%i in ('forfiles /s /d -7') do del /f /s /q "%%i"
pause

без forfiles
@echo off
set "d=C:\papka"
for /f "delims=" %%a in ('2^>nul dir /a-d/b/o-d "%d%"^|more +7') do del /q "%d%\%%~a"
pause


для копирования del с ключами поменять на copy

Sargezzz
13-08-2018, 17:34
alpap,

выполняю батник с кодом:
cd /d "D:\Resource"

for /f "delims=" %%i in (forfiles /s /d -7) do xcopy /f /s /y "D:\Resource\" "D:\files\" "%%i"
pause

пишется ответ: "The system cannot find the file forfiles."

в чем моя ошибка?

Iska
13-08-2018, 18:02
в чем моя ошибка? »
В отсутствии кавычек, обрамляющих команду. Поскольку кавычек нет, цикл разбора по for /f пытается найти файл.

Либо:
for /f "delims=" %%i in ('forfiles /s /d -7') do xcopy /f /s /y "D:\Resource\" "D:\files\" "%%i"
либо:
for /f "usebackq delims=" %%i in (`forfiles /s /d -7`) do xcopy /f /s /y "D:\Resource\" "D:\files\" "%%i"

Sargezzz
13-08-2018, 18:15
Iska,

спасибо за помощь, я пробовал и с кавычками,


D:\Resource>for /F "delims=" %i in ('forfiles /s /d -7') do xcopy /f /s /y "D:\Resource\" "D:\files\" "%i"


в командной строке просто выводится выше стоящее и больше ничего не происходит.

Iska,

когда пробую второй вариант, тогда результат следующий:

C:\Windows\system32>cd /d "D:\Resource"

D:\Resource>for /F "usebackq delims=" %i in ('forfiles /s /d -7') do xcopy /f /s /y "D:\Resource\" "D:\files" "%i"

D:\Resource>xcopy /f /s /y "D:\Resource\" "D:\files\" "forfiles /s /d -7"
Invalid number of parameters
0 File(s) copied


Ошибка: "Invalid number of parameters"

alpap
13-08-2018, 18:52
Sargezzz,
вот этот код:

@echo off
set "d1=C:\papkaIN"
set "d2=C:\papkaOUT"

pushd "%d1%"
for /f "delims=" %%i in ('forfiles /s /d -7') do copy "%%i" "%d2%"
popd
pause

скорировать отсюда, вставить в открытый созданный прямо в корне диска C: (или D) файл txt, сохранить как: Name.bat и запустить стандартно ЛКМ. Естественно указав в переменных (2 и 3 строка) свои пути.

Iska
13-08-2018, 18:55
в командной строке просто выводится выше стоящее и больше ничего не происходит. »
А что должно происходить?

когда пробую второй вариант, тогда результат следующий:
C:\Windows\system32>cd /d "D:\Resource"
D:\Resource>for /F "usebackq delims=" %i in ('forfiles /s /d -7') do xcopy /f /s /y "D:\Resource\" "D:\files" "%i"
D:\Resource>xcopy /f /s /y "D:\Resource\" "D:\files\" "forfiles /s /d -7"
Invalid number of parameters
0 File(s) copied
Ошибка: "Invalid number of parameters" »
Я вроде бы специально выделял и кавычки, и параметр usebackq, дабы их можно было просто взять — и скопировать. Но нет, Вы пошли своим путём.

Когда указан параметр usebackq, используются обратные кавычки. Вернитесь, скопируйте и увидите разницу между первым примером и вторым. Параметр usebackq обычно пользуют, когда одинарные кавычки потребны в тексте самой команды. Никакой другой принципиальной разницы между двумя приведёнными примерами нет, можно использовать как одно, так и другое.

Sargezzz
13-08-2018, 19:04
alpap,

спасибо!!!




© OSzone.net 2001-2012