Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/88: Рейтинг темы: голосов - 88, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21

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

14.09.2012, 13:26. Показов 16604. Ответов 14

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

Добавлено через 23 часа 3 минуты
Пожалуйста помогите! Очень нужно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2012, 13:26
Ответы с готовыми решениями:

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

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

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

14
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
15.09.2012, 22:28
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
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
17.09.2012, 13:44  [ТС]
Спасибо!
Скриптик помог.
Подскажите пож что нужно дописать чтобы одним скриптом копировать инфу с разных источников в разные папки и вести отдельный к каждому копированию лог?
Пример:

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
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.09.2012, 16:55
Придеться повторять в нужном кол-ве раз. Так попробуйте:
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
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
17.09.2012, 18:22  [ТС]
Работает!
Спасибо.

Добавлено через 11 минут
Батник будет запускаться в три часа ночи (ежедневно), нужно чтобы ко всему Вами написаному не копировались файлы созданные в день выполнения батника.
Почему это нужно. Файл созданный утром на протяжении дня пишет инфу.
Подскажите пож, что нужно дописать?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.09.2012, 18:26
Разве этот ключик не работает /minage:1
???
Может 2 поставить. Поэкспериментируйте.
0
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
18.09.2012, 11:03  [ТС]
Добрый день!
Скрипт с /minage:1 работает (robocopy.exe отсутствовала в системе).
При выполнении скрипта заметил один нюанс:
- После первого копирования в лог пишется файл который не скопировался. (Этот самый лог предназначен для записи скопированых файлов и дальнейшей сверки при послед-х копированиях);
- А вот уже после второго копирования в этот самый лог записываются и сами скопированые файлы.
Получается, что не скопированые файлы которые попали в этот лог завтра не будут скопированы.
Подскажите пож как устранить такую коллизию?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.09.2012, 11:37
Т.е. была ошибка во время копирования?
Нужна проверка, если файл скопирован без ошибок - записывать в лог.
Так, я понимаю?
0
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
18.09.2012, 12:02  [ТС]
После подкидывания робокопи.ехе при копировании ошибок не было.
Нужно вести лог скопированых файлов, но не копировать файлы за текущий день (такую инфу не писать в лог, либо же писать но не в тот в который записываются скопированые файлы).
Итого, что есть:
1. Файлы копируются и пишутся в лог; (+)
2. При след копировании идет сверка по ранее записаным файлам в лог; (+)
3. Копирование файлов не включая тек. день (+). Такие файлы пишутся в лог ранее скопированых файлов. (-)
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
21.09.2012, 20:08
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
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
25.09.2012, 13:01  [ТС]
Ухты, Круть. Работает!!!
ТО что нужно.
Спасибо большущее.
0
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
06.12.2012, 16:33  [ТС]
Привет!
Подскажи пож как задать копирования только одного формата файлов?

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

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

set $from=C:\Program Files\Tenable\Nessus\nessus\users\report s
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
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
06.12.2012, 17:37
set $from=C:\Program Files\Tenable\Nessus\nessus\users\report s\*.nessus
0
1 / 1 / 0
Регистрация: 13.09.2012
Сообщений: 21
06.12.2012, 19:10  [ТС]
Не тут то было) пробовал уже так.
Выдает ошибку:
ERROR : Invalid Parameter #1 : "C:\Program Files\Tenable\Nessus\nessus\users\report s\*.nessus"
0
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
06.12.2012, 21:33
Цитата Сообщение от m0z0k Посмотреть сообщение
Не тут то было
Не заметил, что %$from% используется в 2х местах.
Тогда так:
for /f "delims=" %%i in ('dir "%$from%\*.nessus" /B/A:-D') do Call :CheckLog "%%i"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2012, 21:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru