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

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

shadowjkee 11-09-2017 12:00 2764045

Копирование файлов в папку по smb за предыдущий день
 
Добрый день.
Имеется следующее: "Сервер А", на котором собираются лог-файлы в 23 раздельных каталога с градацией по дням(маска названий файлов yyyyddmm.log) и "Сервер Б", куда необходимо перемещать данные файлы, так же с делением на 23 каталога (доступ в каталоги расшарен посредством smb).
Задача такова: необходимо перемещать с "Сервера А" на "Сервер Б" лог файлы по такому принципу - 11.09.2017 переместить файлы за 10.09.2017 в каждый каталог.
Как вариант, можно для каждого каталога сделать отдельный bat'ник, чтобы не городить всё это в одном файле.
Надеюсь на вашу помощь :)

alpap 11-09-2017 13:23 2764060

уточню, так надо?

Именно 11.09.2017 (конкретная дата) или сегодня, переместить по следующей схеме:

papka1 in
file1 10.09.2017 (будет удален)
file2 10.09.2017 (будет удален)
file1 09.09.2017
file2 09.09.2017
file3 10.08.2017
file1 10.08.2017

papka1 out
file1 10.09.2017
file2 10.09.2017

...
papka23 in
file1 10.09.2017 (будет удален)
file2 10.09.2017 (будет удален)
file1 09.09.2017
file2 09.09.2017
file3 10.08.2017
file1 10.08.2017

papka23 out
file1 10.09.2017
file2 10.09.2017

shadowjkee 11-09-2017 13:47 2764068

Извиняюсь, в первом сообщении неточно описал ситуацию:
1. с "Сервера А" нужно копировать файлы на "Сервер Б", а не удалять их
2. необходимо копировать файлы за предыдущий день (поэтому для примера и взял даты текущего и пред идущего дня)

megaloman 11-09-2017 15:33 2764085

shadowjkee,
Цитата:

Цитата shadowjkee
c Сервера А" нужно копировать файлы на "Сервер Б", »

то есть, как я понимаю, в ответе должно получиться, что на "Сервере Б" должны содержаться все файлы, что на "Сервере A", за исключением файлов за сегодняшний день. Вот вариант, который это делает:
Копирует все файлы по указанной маске, но при этом:
1. Не копируется файл с именем сегодняшнего дня.
2. Не копируются файлы, уже имеющиеся на "Сервере Б". При ежедневном копировании в норме будут копироваться только файлы вчерашнего дня.
Предполагается, что дата в системе отображается в виде дд.мм.гггг

Для каждой папки вызовите в батнике процедуру :Copir
Код:

@Echo Off

Set "Maska=20??????.log"
Set "ToDayFile=%Date:~6,4%%Date:~3,2%%Date:~0,2%.log"

Call :Copir "Z:\Box_In\папка 1" "Z:\Box_Out\папка 1"
Call :Copir "Z:\Box_In\папка 2" "Z:\Box_Out\папка 2"

GoTo :Eof

:Copir
        For %%f IN ("%~1\%Maska%") DO (
                If Not "%%~nxf"=="%ToDayFile%" If Not Exist "%~2\%%~nxf" (
                        Copy "%%f" "%~2\" >nul
                )
        )
GoTo :Eof


shadowjkee 12-09-2017 06:42 2764199

Спасибо, скрипт работает. Правда есть одно уточнение: на "Сервере Б" эти файлы не сохраняются, а сразу перехватываются обработчиком и удаляются из каталогов. как в таком случае будет проходить проверка на "2. Не копируются файлы, уже имеющиеся на "Сервере Б"."?

megaloman 12-09-2017 12:33 2764266

Цитата:

Цитата shadowjkee
Правда есть одно уточнение: на "Сервере Б" эти файлы не сохраняются, а сразу перехватываются обработчиком и удаляются из каталогов. как в таком случае будет проходить проверка на "2. »

Да никак, все файлы, кроме сегодняшних, в таких условиях будут копироваться. Смысл задачи был до конца не прописан.
Вот вариант, который скопирует файл предыдущего рабочего дня. Если это было вчера - значит, вчерашний. Анализ даты - на основе имени файла формата ггггммдд.log.
Код:

@Echo Off

Set "Maska=20??????.log"
Set "ToDayFile=%Date:~6,4%%Date:~3,2%%Date:~0,2%.log"

Call :Copir "Z:\Box_In\папка 1" "Z:\Box_Out\папка 1"
Call :Copir "Z:\Box_In\папка 2" "Z:\Box_Out\папка 2"

GoTo :Eof

:Copir
        For /F "usebackq delims=" %%f IN (`Dir "%~1\%Maska%" /B /A:-D /O:-N 2^>nul`) DO (
                If /I Not "%%~nxf"=="%ToDayFile%" (
                        Copy "%~1\%%f" "%~2\" >nul
                        GoTo :Eof
                )
        )
GoTo :Eof

Я убрал здесь проверку наличия скопированного файла, так так
Цитата:

Цитата shadowjkee
эти файлы не сохраняются, а сразу перехватываются обработчиком и удаляются из каталогов »

так что при повторном запуске батника при наличии файла на "Сервере Б" он будет переписан. В принципе, проверку можно вернуть.

mwz 12-09-2017 12:41 2764271

Цитата:

Цитата shadowjkee
маска названий файлов yyyyddmm »

Всё равно маска не dd.mm.yyyy, т.е. создаёте сами. И лучше бы yyyymmdd — проще и смотреть по порядку, и обрабатывать.

shadowjkee 12-09-2017 13:19 2764276

megaloman, ой. действительно. перепутал формат имени лог-файлов. верный формат - yyyymmdd.log . Видимо глаза совсем замылились :)


Время: 15:43.

Время: 15:43.
© OSzone.net 2001-