Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
1

Копирование файлов с проверкой их наличия в списке копированных ранее

14.09.2012, 13:26. Просмотров 5044. Ответов 14

Добрый день!
Помогите написать батник, суть ниже:
Нужно копировать файлы по сети с записью лога (имена скопированых файлов). И чтобы перед следующим копированием шла сверка с записью в логах, если ранее файл копировался - то его не копируем, если в логах отсутствует - копируем.
Спасибо!

Добавлено через 23 часа 3 минуты
Пожалуйста помогите! Очень нужно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2012, 13:26
Ответы с готовыми решениями:

Копирование файлов с проверкой
Подскажите как правильно написать батник для копирования файла из каталога в другой каталог с...

Проверка наличия на диске в указанном каталоге перечисленных в списке файлов и вывод имен отсутствующих
Проверка наличия на диске в каталоге, указанном первым параметром КФ файла FNames.txt, содержащего...

Проверка наличия файлов для каждого дня месяца и копирование недостающих
Добрый день, есть такая ситуация,в папках содержаться архивы формата 2015-01-01-имя.7z, так нужно...

Проверка наличия папки и последующее копирование файлов в зависимости от разрядности системы
Доброго времени! Возникла потребность в написании скрипта для копирования расширения...

Копирование файлов не ранее указанной даты
Какие команды использовать в терминале Linux чтобы ввести дату и скопировать файлы, созданные не...

14
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
15.09.2012, 22:28 2
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Echo off
::Откуда (путь без кавычек)
set $from=e:\2
::Куда (путь без кавычек)
set $dest=e:\1
::Путь к файлу протокола
set $log=e:\copyfile.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do (
  Call :CheckLog "%%i"
)
goto :eof
 
:CheckLog
If Exist "%$log%" For /f "delims=" %%a in (%$log%) Do If "%%a"=="%~1" Exit /B
copy /y %$from%\"%~1" "%$dest%" 1>nul
if %errorlevel%==0 (echo.Copy is successful - %~1&echo.%~1>>"%$log%")
Добавлено через 18 минут
Этот код подходит только применительно к файлам в заданной папке без рекурсии.

Добавлено через 28 минут
Возможно, Вам стоит еще посмотреть эту тему: Создание лога копирования файлов: что, куда и сколько времени на это ушло
0
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
17.09.2012, 13:44  [ТС] 3
Спасибо!
Скриптик помог.
Подскажите пож что нужно дописать чтобы одним скриптом копировать инфу с разных источников в разные папки и вести отдельный к каждому копированию лог?
Пример:

Bash
1
2
3
from=\\10.10.10.17\AgentLog
dest=D:\EDGE1
log=D:\edge1.log
Bash
1
2
3
from=\\10.10.10.18\AgentLog
dest=D:\EDGE2
log=D:\edge2.log
Bash
1
2
3
from=\\10.10.10.19\AgentLog
dest=D:\EDGE3
log=D:\edge3.log
Добавлено через 13 минут
И чтобы не копировался файл созданный сегодня.
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
17.09.2012, 16:55 4
Придеться повторять в нужном кол-ве раз. Так попробуйте:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Echo off
::Откуда (путь без кавычек)
set $from=e:\2
::Куда (путь без кавычек)
set $dest=e:\1
::Путь к файлу протокола
set $log=e:\copyfile.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
 
set $from=e:\222
set $dest=e:\333
set $log=e:\copyfile2.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
 
set $from=e:\444
set $dest=e:\555
set $log=e:\copyfile3.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
goto :eof
 
:CheckLog
If Exist "%$log%" For /f "delims=" %%a in (%$log%) Do If "%%a"=="%~1" Exit /B
robocopy "%$from%" "%$dest%" "%~1" /minage:1
if %errorlevel%==0 (echo.Copy is successful - %~1&echo.%~1>>"%$log%")
1
17.09.2012, 16:55
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
17.09.2012, 18:22  [ТС] 5
Работает!
Спасибо.

Добавлено через 11 минут
Батник будет запускаться в три часа ночи (ежедневно), нужно чтобы ко всему Вами написаному не копировались файлы созданные в день выполнения батника.
Почему это нужно. Файл созданный утром на протяжении дня пишет инфу.
Подскажите пож, что нужно дописать?
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
17.09.2012, 18:26 6
Разве этот ключик не работает /minage:1
???
Может 2 поставить. Поэкспериментируйте.
0
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
18.09.2012, 11:03  [ТС] 7
Добрый день!
Скрипт с /minage:1 работает (robocopy.exe отсутствовала в системе).
При выполнении скрипта заметил один нюанс:
- После первого копирования в лог пишется файл который не скопировался. (Этот самый лог предназначен для записи скопированых файлов и дальнейшей сверки при послед-х копированиях);
- А вот уже после второго копирования в этот самый лог записываются и сами скопированые файлы.
Получается, что не скопированые файлы которые попали в этот лог завтра не будут скопированы.
Подскажите пож как устранить такую коллизию?
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
18.09.2012, 11:37 8
Т.е. была ошибка во время копирования?
Нужна проверка, если файл скопирован без ошибок - записывать в лог.
Так, я понимаю?
0
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
18.09.2012, 12:02  [ТС] 9
После подкидывания робокопи.ехе при копировании ошибок не было.
Нужно вести лог скопированых файлов, но не копировать файлы за текущий день (такую инфу не писать в лог, либо же писать но не в тот в который записываются скопированые файлы).
Итого, что есть:
1. Файлы копируются и пишутся в лог; (+)
2. При след копировании идет сверка по ранее записаным файлам в лог; (+)
3. Копирование файлов не включая тек. день (+). Такие файлы пишутся в лог ранее скопированых файлов. (-)
1
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
21.09.2012, 20:08 10
m0z0k, я это учел.

Просто, утилита robocopy выдает особенные коды возврата ошибок. (обычно успешное завершение всегда 0, а тут не совсем так ):
1 - успешно скопирован новый файл
0 - успешно заменен файл.

Т.е. там в последней строке вместо цифры 0 нужно поставить 1.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Echo off
::Откуда (путь без кавычек)
set $from=e:\2
::Куда (путь без кавычек)
set $dest=e:\1
::Путь к файлу протокола
set $log=e:\copyfile.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
 
set $from=e:\222
set $dest=e:\333
set $log=e:\copyfile2.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
 
set $from=e:\444
set $dest=e:\555
set $log=e:\copyfile3.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
goto :eof
 
:CheckLog
If Exist "%$log%" For /f "delims=" %%a in (%$log%) Do If "%%a"=="%~1" Exit /B
robocopy "%$from%" "%$dest%" "%~1" /minage:1
if %errorlevel%==1 (echo.Copy is successful - %~1&echo.%~1>>"%$log%")
1
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
25.09.2012, 13:01  [ТС] 11
Ухты, Круть. Работает!!!
ТО что нужно.
Спасибо большущее.
0
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
06.12.2012, 16:33  [ТС] 12
Привет!
Подскажи пож как задать копирования только одного формата файлов?

В таком исполнении сперва копируется заданный формат, а потом все остальное. Мне нужно чтобы только заданный формат копировался.

Поправь пож как будет правильно.

set $from=C:\Program Files\Tenable\Nessus\nessus\users\reports
set $dest=C:\Arc\Rep
set $log=C:\Arc\ness_rep_copy.log
for /f "delims=" %%i in ('dir "%$from%" /B/A:-D') do Call :CheckLog "%%i"
goto :eof

:CheckLog
If Exist "%$log%" For /f "delims=" %%a in (%$log%) Do If "%%a"=="%~1" Exit /B
C:\Arc\robocopy.exe "%$from%" "%$dest%" *.nessus "%~1"
if %errorlevel%==1 (echo.Copy is successful - %~1&echo.%~1>>"%$log%")
cd C:\Arc\Rep
for %%I in (*.nessus) do copy nul "%%~nI.nessus_done"
0
gimntut
882 / 184 / 16
Регистрация: 18.07.2011
Сообщений: 260
06.12.2012, 17:37 13
set $from=C:\Program Files\Tenable\Nessus\nessus\users\reports\*.nessus
0
m0z0k
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
06.12.2012, 19:10  [ТС] 14
Не тут то было) пробовал уже так.
Выдает ошибку:
ERROR : Invalid Parameter #1 : "C:\Program Files\Tenable\Nessus\nessus\users\reports\*.nessus"
0
gimntut
882 / 184 / 16
Регистрация: 18.07.2011
Сообщений: 260
06.12.2012, 21:33 15
Цитата Сообщение от m0z0k Посмотреть сообщение
Не тут то было
Не заметил, что %$from% используется в 2х местах.
Тогда так:
for /f "delims=" %%i in ('dir "%$from%\*.nessus" /B/A:-D') do Call :CheckLog "%%i"
0
06.12.2012, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 21:33

Копирование файлов по маске из заданной ранее директории переменной
Здраствуйте . Я начинающий. Создал код , при выполнении которого , при выборе в диалоговом окне...

Копирование всех файлов, перечисленных в списке, содержащемся в текстовом файле, в заданную директорию
Здравствуйте! Помогите сделать лабу. Нужно сделать батник. Вот задание: 2)Создать командный...

Загрузка картинки в image с проверкой, не было ли это сделано ранее
как сделать что бы перед загрузкой картинки в image сначала проверилось загружена ли уже картинка?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru