PDA

Показать полную графическую версию : [решено] Создать батник с логом копирования и проверкой.


TupaH
13-01-2012, 11:41
Требуется создать батник, который бы копровал из 3-х папок файлы в 1, записывая в текстовый файл имена скопированых файлов и при следующем запуске не копировал бы их. (папка переодически отчищается другой программой).
Заранее спасибо.

zion87
13-01-2012, 20:09
TupaH, можно попробовать вот так(копирует файлы *.ini из каталогов d:\1, d:\2, d:\3 в каталог d:\fin так же ведется отчет о скопированных файлах в report.txt)

@echo off
set put1=d:\1
set put2=d:\2
set put3=d:\3
set finP=d:\fin
set report=d:\report.txt
for /f %%a in (' dir /b %put1%\*.ini ') do if not exist %finP%\%%a echo %%a>>%report% && (
echo n|copy /-y %put1%\%%a %finP%\
)
for /f %%b in (' dir /b %put2%\*.ini ') do if not exist %finP%\%%b echo %%b>>%report% && (
echo n|copy /-y %put2%\%%b %finP%\
)
for /f %%c in (' dir /b %put3%\*.ini ') do if not exist %finP%\%%c echo %%c>>%report% && (
echo n|copy /-y %put3%\%%c %finP%\
)
goto:eof

Busla
13-01-2012, 23:36
можно не txt с именами обновлять, а использовать предназначенный специально для этого атрибут файла "archive"

TupaH
15-01-2012, 15:07
Почти то что нужно, только нужно чтобы не копировал уже ранее скопированные файлы. Чтобы проверял проверял в отчете report.txt копировался ли этот файл раньше, если да, то не копировать, если нет, то скопировать. Этот алгоритм если удалить из папки d:\fin уже скопированный файл, копирует его туда опять.

zion87
15-01-2012, 18:05
TupaH, я сам слабо разбираюсь во всем этом деле не знаю как сравнить переменную с каждой строчкой из файла, может другие товарищи подскажут... если нет, то смогу предложить то что и я смогу сделать, создать в папке fin директорию temp и создавать там файлы с именами скопированных и размером 0 байт и проверка будет такая:
если файл с таким именем есть в папке d:\fin\temp - есть то копирования не будет...

megaloman
15-01-2012, 22:42
@Echo Off

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

Set From="E:\DelTmp\Dir 1" "E:\DelTmp\Dir 2" "E:\DelTmp\Dir 3"
Set To=E:\DelTmp\Dir 4

Set LogFile=E:\DelTmp\Log.txt
If Not Exist %LogFile% cd / >%LogFile%

FOR %%d IN (%From%) DO For %%f In ("%%~d\*.*") Do (
FOR /F "usebackq delims=" %%n IN (`xcopy "%%f" "%To%\" /EXCLUDE:%LogFile% /Q`) DO (
Set nfil=%%n
Set nFil=!nFil:~-2!
If !nFil!==1. Echo %%~nxf>>%LogFile%
)
)

TupaH
18-01-2012, 12:45
Спасибо, то что нужно!!

TupaH
23-01-2012, 13:49
Немного не понятно, не работает на WinServer 2003, не пишет лог файлов, сам файл создает, на XP все без проблем.

TupaH
23-01-2012, 15:41
Один и тотже батник, в одной и тойже папке на ХР работает, на 2003 нет. Проблема не с доступом, если убираю условие приверки скопирован ли файл Set nfil=%%n
Set nFil=!nFil:~-2!
If !nFil!==1. »
, то лог пишется все время, был скопирован или нет Echo %%~nxf>>%LogFile% »
такчто трабл не в путях и не в доступе:(
и недо конца поны эти строчки, поясните плиз, особенно 2-я и 3-я
Set nfil=%%n
Set nFil=!nFil:~-2!
If !nFil!==1. »

megaloman
23-01-2012, 19:18
Я в недоумении: в Win2003 R2 Enterprise всё чудненько работает. Вот немного изменённый батник@Echo Off

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

Set From="D:\DelTmp\Dir 1" "D:\DelTmp\Dir 2" "D:\DelTmp\Dir 3"
Set To=D:\DelTmp\Dir 4

Set LogFile=D:\DelTmp\Log.txt
If Not Exist %LogFile% cd "%~dp0" >%LogFile%

rem ------------------------------------------
Echo "%From%">kuku
Echo "%To%">>kuku
Echo "%LogFile%">>kuku
rem ------------------------------------------

FOR %%d IN (%From%) DO For %%f In ( "%%~d\*.*" ) Do (
FOR /F "usebackq delims=" %%n IN (`xcopy "%%f" "%To%\" /EXCLUDE:%LogFile% /Q /Y`) DO (
Set nfil=%%n
Set nFil=!nFil:~-2!
rem ------------------------------------------
Echo %%n !nFil! >>kuku
rem ------------------------------------------
If !nFil!==1. Echo %%~nxf>>%LogFile%
)
) чуть изменил первый If и добавил для надёжности ключ в Xcopy. Плюс наставил отладочный вывод в файл куку который образуется рядом с батником. Я бы хотел увидеть его содержимое.
Для отладки посылаю Вам свою упакованную папку с примером - распакуйте в корень D: с поддиректориями и выполните внутри папки DelTmp имеющийся батник

TupaH
24-01-2012, 10:18
Понял проблему, Win2003 у меня инглиш версия и инфу о скопированных файлах он пишет по другому, количество не в конце строки, а в начале, бросаю оба файла, с ХР и 2003. Исправьте плиз, ото как раз эта строчка мне и не понятна, как она убирает текст и оставляет цифру.

megaloman
24-01-2012, 13:34
Проверить мне не на чем, у меня на Win2003 с MUI. Попробуйте заменить фрагмент батника Set nFil=!nFil:~0,1!
rem ------------------------------------------
Echo %%n !nFil! >>kuku
rem ------------------------------------------
If !nFil!==1 Echo %%~nxf>>%LogFile%
Set nFil=!nFil:~0,1! вырезает в начале строки символ. Подробнее читайте в помощи к Set, например, чтобы сохранить подсказку в файл, запустите из ком строки
Set /? >D:\_set_help
Если прокатит, удалите строки между rem в двух местах, где пишутся отлад печати и пользуйтесь на здоровье
А вообще-то теперь буду думать как сделать задачу по другому

TupaH
24-01-2012, 13:51
Все работает, спасибо.




© OSzone.net 2001-2012