Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Копировать файлы из одной папки в другую с помощью XCOPY (http://forum.oszone.net/showthread.php?t=336166)

Sargezzz 13-08-2018 13:55 2826183

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

использую команду 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 2826189

Код:

forfiles /?

Sargezzz 13-08-2018 15:12 2826198

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

megaloman 13-08-2018 15:30 2826199

Цитата:

Цитата Sargezzz
а каким образом можно в командной строке высчитать дату по формуле: ТекДата - 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 2826205

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 2826208

Цитата:

Цитата Sargezzz
высчитать дату по формуле: ТекДата - 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 2826216

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 2826219

Цитата:

Цитата Sargezzz
в чем моя ошибка? »

В отсутствии кавычек, обрамляющих команду. Поскольку кавычек нет, цикл разбора по 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 2826223

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 2826231

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 2826232

Цитата:

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

А что должно происходить?

Цитата:

Цитата Sargezzz
когда пробую второй вариант, тогда результат следующий:
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 2826234

alpap,

спасибо!!!


Время: 23:57.

Время: 23:57.
© OSzone.net 2001-