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

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

POSTREALITY 21-11-2016 19:22 2689470

Копирование новых файлов каждые 30 минут.
 
Знатоки, приветствую.
Помогите пожалуйста реализовать задачу.
Есть два каталога:
"Cat-1"
"Cat-2"
В каталог "Cat-1", каждые 5 минут сваливаются всякие разные непонятные файлы. Задача в том, чтобы написать скрипт, который я буду запускать в шедулере каждые 30 минут.
Сам скрипт должен искать в каталоге "Cat-1" файлы, начинающиеся с Английской буквы I, с любым расширением, которые свалились в данный каталог с момента последнего запуска скрипта (30 минут) и копировать (не перемещать) все подходящие под правило файлы в каталог "Cat-2".
Каталог "Cat-1" всегда пухнет новыми файлами, заменяемых файлов нет, дата создания всегда соответствует фактическому времени падения файла в каталог "Cat-1".
Помогите плиз с написанием скрипта.
Всем неравнодушным - огромный кармаплюс!!!

raddy 21-11-2016 19:37 2689477

Цитата:

Цитата POSTREALITY
Есть два каталога: »

Можно так попробовать
xcopy c:\cat-1\i*.* c:\cat-2 /d /y

POSTREALITY 21-11-2016 19:49 2689478

Цитата:

Цитата raddy
/d /y »

Здравствуйте.
А как в таком случае скрипт будет понимать какие файлы я скопировал часом ранее?
Допустим:
в 11:55 в папке лежат файлы 1, 2, 3 и 4. В 12:00 я запускаю скрипт и копирую файлы в "Cat-2". За полчаса с 12:00 до 12:29:59 в папку свалились ещё файлы 5,6,7 и 8. В 12:30 я запускаю скрипт вновь, теперь надо чтобы он понял что файлы за ПОЗАпрошлый промежуток времени (с 11:30 до 11:59:59) копировать не надо, а надо копировать файлы только за ПРОШЛЫЙ промежуток времени с 12:00 до 12:29:59.
Спасибо!

raddy 21-11-2016 19:53 2689479

Цитата:

Цитата POSTREALITY
А как в таком случае скрипт будет понимать какие файлы я скопировал часом ранее? »

Параметр /d позволяет игнорировать файлы с одинаковым временем и датой.

POSTREALITY 21-11-2016 20:03 2689483

Цитата:

Цитата raddy
Параметр /d позволяет игнорировать файлы с одинаковым временем и датой. »

А, я понял. Большое Вам спасибо за помощь, но к сожалению, тут требуется более кардинальное решение. Беда в том, что буквально через несколько месяцев кол-во файлов в "Cat-1" возрастёт до десятков тысяч, а через год их там будет более 100 000 файлов, и процесс копирования всего грубо говоря каталога с отбрасыванием уже существующих файлов будет сам по себе занимать более получаса :)
В текущем вопросе требуется решение, которое будет опираться именно на временной отрезок 30 минут, а остальные файлы не трогать.
Ещё раз большое Вам спасибо!

raddy 21-11-2016 20:08 2689484

Цитата:

Цитата POSTREALITY
и процесс копирования всего грубо говоря каталога с отбрасыванием уже существующих файлов будет сам по себе занимать более получаса »

В данном случае копируются только новые или изменившиеся файлы. А сравнение каталогов с 10-100к файлами (или их индексирование) - в любом случае будет ресурсоёмким.

POSTREALITY 22-11-2016 11:51 2689639

Цитата:

Цитата raddy
В данном случае копируются только новые или изменившиеся файлы. »

Большое спасибо! Об этом я и не подумал, что даже при работе по времени, он всё равно будет читать весь каталог. Вы правы!

POSTREALITY 22-11-2016 13:02 2689652

Цитата:

Цитата raddy
xcopy c:\cat-1\i*.* c:\cat-2 /d /y »

Странно, делаю так:
@echo off
set otkuda="\\10.0.2.10\smbd\__WorkeInfo\NRD_GATE\INBOX"
set kuda="C:\gera-cmd\test\"
xcopy %otkuda%\I*.* %kuda% /d /y
Ничего не копируется.

А если делаю так:
@echo off
set otkuda="\\10.0.2.10\smbd\__WorkeInfo\NRD_GATE\INBOX"
set kuda="C:\gera-cmd\test\"
xcopy %otkuda%\I*.* %kuda% /d /y /e
То копируются все папки и файлы, а не только начинающиеся с буквы I.

raddy 22-11-2016 13:31 2689655

Цитата:

Цитата POSTREALITY
Ничего не копируется. »

Если в консоли запустить без @echo off, что скажет?

POSTREALITY 22-11-2016 13:35 2689656

Цитата:

Цитата raddy
Если в консоли запустить без @echo off, что скажет? »

Ошибок нет, пишет - скопировано файлов: 0, хотя в папке \\10.0.2.10\smbd\__WorkeInfo\NRD_GATE\INBOX лежит более 20 тестовых папок и файлов с разными именами, включая начинающиеся с буквы I.

raddy 22-11-2016 13:42 2689658

Цитата:

Цитата POSTREALITY
более 20 тестовых папок »

Для вложенных каталогов нужно запускать: xcopy %otkuda%\I*.* %kuda% /d /y /e - в задаче речь шла лишь об одном каталоге без рекурсии.

POSTREALITY 22-11-2016 14:04 2689660

Цитата:

Цитата raddy
Для вложенных каталогов нужно запускать: xcopy %otkuda%\I*.* %kuda% /d /y /e - в задаче речь шла лишь об одном каталоге без рекурсии. »

Всё верно, только он почему-то копирует всё подряд, а не только то что начинается с буквы I.

raddy 22-11-2016 14:33 2689665

Цитата:

Цитата POSTREALITY
Всё верно, только он почему-то копирует всё подряд, а не только то что начинается с буквы I. »

тогда так можно сделать (выделенное изменено):
@echo off
set otkuda="\\10.0.2.10\smbd\__WorkeInfo\NRD_GATE\INBOX"
set kuda="C:\gera-cmd\test"
robocopy /dcopy:t /e /xo %otkuda% %kuda% i*.*

POSTREALITY 22-11-2016 15:22 2689671

Цитата:

Цитата raddy
тогда так можно сделать (выделенное изменено): »

Странно, не понимаю, но он всё равно копирует всё подряд, сливает полностью весь каталог капля в каплю.

raddy 22-11-2016 15:24 2689673

Цитата:

Цитата POSTREALITY
сливает полностью весь каталог капля в каплю. »

А время/дата файлов в каталоге назначения совпадает с источником, или текущая?

POSTREALITY 22-11-2016 15:46 2689680

Цитата:

Цитата raddy
А время/дата файлов в каталоге назначения совпадает с источником, или текущая? »

Тут вообще странное дело. Проверил все каталоги внутри корневого каталога INBOX.
Представим схему:
Уровень 1 - это корневой каталог INBOX
Уровень 2 - это подкаталоги (именно их название мы вылавливаем и копируем только те что начинаются с буквы I
Уровень 3 - файлы внутри подкаталогов
Так что он делает, он ищет файлы с названиями начинающимися на букву I на третьем уровне и если нет соответствий то просто копирует каталог второго уровня пустым.
В итоге у меня получается что он сейчас копирует просто пустые подкаталоги второго уровня и из общего объёма информации в 250 мегабайт, копируется только 3 мегабайта инфы :), остальное пустые каталоги второго уровня. Получаемся, что он ищет заданное соответствие имени не на втором уровне а на третьем. В этом ошибка.
Спасибо!

raddy 22-11-2016 16:00 2689686

Цитата:

Цитата POSTREALITY
Получаемся, что он ищет заданное соответствие имени не на втором уровне а на третьем. В этом ошибка. »

То есть получается, если есть каталог, имя которого начинается с буквы I - его нужно скопировать полностью, не взирая на содержимое?

POSTREALITY 22-11-2016 16:05 2689687

Цитата:

Цитата raddy
То есть получается, если есть каталог, имя которого начинается с буквы I - его нужно скопировать полностью, не взирая на содержимое? »

Ага, точно, даже если он пустой, всё равно копируем.

POSTREALITY 22-11-2016 19:30 2689741

Цитата:

Цитата raddy
То есть получается, если есть каталог, имя которого начинается с буквы I - его нужно скопировать полностью, не взирая на содержимое? »

Вот что-то похожее, но не могу понять где ошибка:

SETLOCAL EnableDelayedExpansion
set otkuda="C:\gera-cmd\test2"
set kuda="C:\gera-cmd\test"

for /f %%i in ('dir /b/s/ad %otkuda% ^| findstr /i "I*"') do (
set "d=%%i"
xcopy /q/s/y/r/h "!d!" "!d:%otkuda%=%kuda%!\"
)
xcopy /q/s/y/r/h "%otkuda%\I*" "%kuda%"
pause

Теперь он копирует каталоги начинающиеся с буквы I, но, зараза, копирует ещё и другие каталоги в которых есть файлы с буквой i, а мне нужно смотреть только на имена каталогов, а что внутри без разницы :(
Честно говоря, я в FOR вообще не понимаю. Попробовал убрать ключ /i у findstr, без полезно, хоть файлики третьего уровня и написаны с маленькими i , всё равно он их как-то цепляет даже без ключа /i. А папки на втором уровне всегда написаны с большой буквы I, так всегда и будет.

megaloman 22-11-2016 21:58 2689776

если есть каталог, имя которого соответствует маске - его нужно скопировать полностью, не взирая на содержимое
Код:

@Echo Off

Set "From=C:\gera-cmd\test2"
Set "To=C:\gera-cmd\test"
Set "Maska=I*.*"

SetLocal EnableExtensions EnableDelayedExpansion

For /F "usebackq delims=" %%d IN (`dir "%From%\%Maska%" /B /S /A:D 2^>nul`) DO (
        Set "DCopy=%%d"
        Xcopy /Q /E /Y /D /R /H "%%d\*.*" "!DCopy:%From%=%To%!\" >nul
)


POSTREALITY 23-11-2016 13:39 2689899

megaloman,
Спасибо большое! Так всё работает :-)


Время: 07:41.

Время: 07:41.
© OSzone.net 2001-