|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник для сравнения файлов |
|
CMD/BAT - [решено] Батник для сравнения файлов
|
Новый участник Сообщения: 16 |
Всем привет!
Оч нужна ваша помощь. Нужен батник для сравнения 2 х файлов по содержимому. Например с фтп копирую файлы, например в с:\tmp\, его копия копируется в архив. Например если в какой нибудь файлик в с:\tmp кто нибудь внес изменения, цифры например поменял или текст какой, то этот файлик нужно переместить в папку c:\error, а другие файлы переместить в папку с:\in и так циклически. Заранее благодарю!!! |
|
Отправлено: 12:34, 13-02-2013 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Кинул один и тот же файл в c:\Tmp и в c:\TmpArc.
Вот результат. По факту файлы остались на старых местах. Левая Файлы Команды Параметры Правая 14:36 C:\>SetLocal EnableExtensions EnableDelayedExpansion Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL. C:\>FOR %f IN (C:\Tmp\*.*) DO ( fc /B "%f" "C:\TmpArc\%~nxf" If !ErrorLevel! == 0 (Move /Y "%f" "C:\TmpIn\" ) Else (Move /Y "%f" "C:\TmpErr \" ) pause ) При вторичном запуске вот так: файл почему то переместился в tmperr C:\>SetLocal EnableExtensions EnableDelayedExpansion Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL. C:\>FOR %f IN (C:\Tmp\*.*) DO ( fc /B "%f" "C:\TmpArc\%~nxf" If !ErrorLevel! == 0 (Move /Y "%f" "C:\TmpIn\" ) Else (Move /Y "%f" "C:\TmpErr \" ) pause ) C:\>( fc /B "C:\Tmp\FarMenu.ini" "C:\TmpArc\FarMenu.ini" If !ErrorLevel! == 0 (Move /Y "C:\Tmp\FarMenu.ini" "C:\TmpIn\" ) Else (Move /Y "C:\Tmp\FarMenu.ini" "C:\TmpErr\" ) pause ) Перемещено файлов: 1. Для продолжения нажмите любую клавишу . . . Не удается найти указанный файл. Для продолжения нажмите любую клавишу . . . Не удается найти указанный файл. Для продолжения нажмите любую клавишу . . . C:\> |
Отправлено: 11:39, 16-02-2013 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Пользователь Сообщения: 90
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Такое возможно? |
|
Отправлено: 12:13, 16-02-2013 | #12 |
Ветеран Сообщения: 2729
|
Профиль | Отправить PM | Цитировать orgia, Мне не удалось повторить Вашу ситуацию, было бы полезным получить от Вас живые файлы. Попробуйте вариант
@echo off Set TmpFtp=D:\Tmp Set TmpArc=D:\TmpArc Set TmpErr=D:\TmpErr Set TmpIn=D:\TmpIn FOR %%f IN (%TmpFtp%\*.*) DO Call :CompMove "%%f" "%TmpArc%\%%~nxf" GoTo :Eof :CompMove If Not %~z1==%~z2 ( Move /Y %1 "%TmpErr%\" >nul GoTo :Eof ) fc /B %1 %2 >nul If %ErrorLevel%==0 ( Move /Y %1 "%TmpIn%\" >nul ) Else ( Move /Y %1 "%TmpErr%\" >nul ) |
------- Последний раз редактировалось megaloman, 16-02-2013 в 13:40. Отправлено: 13:22, 16-02-2013 | #13 |
Ветеран Сообщения: 2729
|
Профиль | Отправить PM | Цитировать Tco 03, Ваше второе сообщение не очень коррелирует с первым. Итак решение ИМХО с условием, совпадающем с предыдущим (как я его понял во втором сообщении):
Есть папка Tmp и TmpArc. Сравниваем файл из D:\Tmp с одноименным файлом в архиве D:\TmpArc. Если файлы разные или в D:\TmpArc его нет, то из D:\Tmp перемещаем файл в D:\TmpErr Если файлы одинаковые, то перемещаем в D:\TmpIn Единственное отличие, файлы могут содержаться в поддиректориях и при перемещении структуру директорий надо сохранить. @echo off FOR /R "D:\Tmp" %%f IN (*.*) DO Call :Files "%%f" GoTo :Eof :Files Set TmpFtp=%1 Set TmpArc=%TmpFtp:D:\Tmp=D:\TmpArc% Set TmpFtp=%~dp1 Set TmpErr=%TmpFtp:D:\Tmp=D:\TmpErr% Set TmpIn=%TmpFtp:D:\Tmp=D:\TmpIn% Call :CompMove %1 %TmpArc% GoTo :Eof :CompMove Set L=1 If Not Exist %2 Set L=0 If %L% EQU 1 If Not %~z1==%~z2 Set L=0 If %L% EQU 0 ( If Not Exist %TmpErr% Md %TmpErr% Move /Y %1 %TmpErr% >nul GoTo :Eof ) fc /B %1 %2 >nul If %ErrorLevel%==0 ( If Not Exist %TmpIn% Md %TmpIn% Move /Y %1 %TmpIn% >nul ) Else ( If Not Exist %TmpErr% Md %TmpErr% Move /Y %1 %TmpErr% >nul ) orgia, В личном сообщении Вы писали Цитата:
|
|
------- Последний раз редактировалось megaloman, 16-02-2013 в 16:16. Отправлено: 16:05, 16-02-2013 | #14 |
![]() Пользователь Сообщения: 90
|
Профиль | Отправить PM | Цитировать megaloman
Цитата megaloman:
Set TmpFtp=.\Tmp Set TmpArc=.\TmpArc Set TmpErr=.\TmpErr Set TmpIn=.\TmpIn Вот со вторым... Просто мне (желательно нужно) чтобы он работал в самой папке, а не до пути к букве диска. Ну ето уже не так уж важно. В любом случаи благодарю за помощь! orgia У меня стоит win7 64x - первый пример работает как надо. Второй пример работает 50/50 он оставляет файлы в папке Tmp Может конечно так и нужно, но первый пример ничего не оставляет в этой папке. Последний пример работает на ура! Переносит все файлы и создаёт точно такие-же папки. |
|
Отправлено: 16:53, 16-02-2013 | #15 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Tco 03:
|
|
Отправлено: 17:46, 16-02-2013 | #16 |
Ветеран Сообщения: 2729
|
Профиль | Отправить PM | Цитировать Если у Вас есть каталог, в котором батник и в котором папки Tmp TmpArc TmpErr TmpIn, то вот кусок кода, который надо вставить в предыдущее решение (ограничение: в папке Tmp ни на каком уровне не должно быть подпапки c совпадающим именем Tmp)
@echo off cd /D "%~dp0" FOR /R "Tmp\" %%f IN (*.*) DO Call :Files "%%f" GoTo :Eof :Files Set TmpFtp=%1 Set TmpArc=%TmpFtp:\Tmp\=\TmpArc\% Set TmpFtp=%~dp1 Set TmpErr=%TmpFtp:\Tmp\=\TmpErr\% Set TmpIn=%TmpFtp:\Tmp\=\TmpIn\% Call :CompMove %1 %TmpArc% GoTo :Eof далее кусок предыдущего решения Цитата:
|
|
------- Последний раз редактировалось megaloman, 16-02-2013 в 18:42. Отправлено: 18:08, 16-02-2013 | #17 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 18:41, 16-02-2013 | #18 |
![]() Пользователь Сообщения: 90
|
Профиль | Отправить PM | Цитировать megaloman
Цитата megaloman:
![]() ![]() |
|
Отправлено: 19:34, 16-02-2013 | #19 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Привет!
Все нормально. проверил на другом ПК, все отрабатывает на УРА. МЕГАреспект!!!! Но возник у меня трабл. Не могу корректно прикрутить в мой батник. Идея такова. Есть входной каталог c:uarm\exg\!in. В него сваливаются сейчас файлики всех типов. 3 типа. 2 вида файликов, которые я должен контролировать с помощью батника(сравнивать с архивом на x:\archive\ГГ.ММ.ДД\out\ ), написанного megaloman. и один тип файлов, которые контролировать не надо. Файлы тянутся фтп, с разных каталогов в одну папку c:uarm\exg\!in, Просьба помочь раскидать файлы по нужным местам. В итоге нужно: Файлы вида set r=I%DATE:~0,2%%b%.??? set rr=L01???????????.0?? set rrr=5005805?????????????????.dat должны контролироваться и кидаться в папку c:uarm\exg\!in файлы вида: set o=%x%%d%???.ED - не контролироваться и просто кидаться в c:uarm\exg\!in Вот мой батник: @ECHO Off if %1.==a. goto Ar & rem бR¤*¤Ё┐ Ar\ set z= set h=c:\o\ set b=05805 set a="%DATE:~8,2%%DATE:~3,2%%DATE:~0,2%" set x=5005805000 rem DD???.ED set d=%DATE:~0,2% if /i %TIME:~0,2% GTR 07 goto x set m=%DATE:~3,2% if %d%==01 if %m%==01 set d=31&goto x if %d%==01 if %m%==02 set d=31&goto x if %d%==01 if %m%==03 set d=29&goto x if %d%==01 if %m%==04 set d=31&goto x if %d%==01 if %m%==05 set d=30&goto x if %d%==01 if %m%==06 set d=31&goto x if %d%==01 if %m%==07 set d=30&goto x if %d%==01 if %m%==08 set d=31&goto x if %d%==01 if %m%==09 set d=31&goto x if %d%==01 if %m%==10 set d=30&goto x if %d%==01 if %m%==11 set d=31&goto x if %d%==01 if %m%==12 set d=30&goto x if /i %d% EQU 02 set d=01& goto x if /i %d% EQU 03 set d=02& goto x if /i %d% EQU 04 set d=03& goto x if /i %d% EQU 05 set d=04& goto x if /i %d% EQU 06 set d=05& goto x if /i %d% EQU 07 set d=06& goto x if /i %d% EQU 08 set d=07& goto x if /i %d% EQU 09 set d=08& goto x if /i %d% EQU 10 set d=09& goto x set /a "d-=1" :x rem set q=%b%%d%???.sig set r=I%DATE:~0,2%%b%.??? set rr=L01???????????.0?? set rrr=5005805?????????????????.dat rem set o=o%d%%b%.??? set o=%x%%d%???.ED rem set oo=??????????.EDS rem set r=r???%d%%a:~3,2%.%b:~2,3% rem set o=o%d%%b%.??? rem set o=%x%%d%???.ED if %1.==. (runas /env /user ![]() echo ### >>%h%log echo ###Start: %DATE% %TIME% >>%h%log :Loop for /L %%i in ( 1,1,10000 ) do echo %%i>NUL set g= cd C:\uarm2\exg\!in\ call %h%transp.bat in mget *.* call %h%transp.bat OUT mget *.* rem dir /b %o%>>%h%log if exist %o% for %%f in ( %o% ) do ( copy %%f C:\uarm2\exg\inc\ & move %%f ar\ & echo %TIME% =i/o %%f= >>%h%log ) rem if exist %oo% for %%f in ( %oo% ) do ( copy %%f C:\uarm\exg\inc\ & move %%f ar\ & echo %TIME% =i/o %%f= >>%h%log ) if exist %r% for %%f in ( %r% ) do ( copy %%f C:\uarm2\exg\cli\ & move %%f ar\ & echo %TIME% =i/o %%f= >>%h%log ) if exist %rr% for %%f in ( %rr% ) do ( copy %%f C:\uarm2\exg\cli\ & move %%f ar\ & echo %TIME% =i/o %%f= >>%h%log ) if exist %rrr% for %%f in ( %rrr% ) do ( copy %%f C:\uarm2\exg\cli\ & move %%f ar\ & echo %TIME% =i/o %%f= >>%h%log ) rem г¤*<_-Ё_ б двЁЇЁ вR<мЄR _б<Ё д*c< ЇаRи_< з_а_ ___ ___ ( в._. Ў_ RиЁЎRЄ R-) rem ЇаЁ_┐ Ё -_ cd C:\uarm2\exg\chk\ for /L %%i in ( 1,1,200000 ) do echo %%i>NUL rem г¤*<_-Ё_ б двЁЇЁ if exist %o% for %%f in ( %o% ) do (call %h%transp.bat in delete %%f & echo delete %o%) if exist %o% for %%f in ( %o% ) do (call %h%transp.bat abs put %%f & move C:\uarm2\exg\chk\%%f ar\ & set g=ok) rem if exist %oo% for %%f in ( %oo% ) do (call %h%transp.bat in delete %%f & echo delete %o%) rem if exist %oo% for %%f in ( %oo% ) do (call %h%transp.bat out\bnk put %%f & move C:\uarm\exg\chk\%%f ar\ & set g=ok) rem RвЇа*ўЄ* ў -_ cd C:\uarm2\exg\ret\ if exist %r% ( for /L %%i in ( 1,1,10000 ) do echo %%i>NUL & move %r% ..\apr\ ) cd C:\uarm2\exg\out\ if exist %r% for /L %%i in ( 1,1,10000 ) do echo %%i>NUL cd C:\uarm2\exg\ret\ if exist %rr% ( for /L %%i in ( 1,1,10000 ) do echo %%i>NUL & move %rr% ..\apr\ ) cd C:\uarm2\exg\out\ if exist %rr% for /L %%i in ( 1,1,10000 ) do echo %%i>NUL cd C:\uarm2\exg\ret\ if exist %rrr% ( for /L %%i in ( 1,1,10000 ) do echo %%i>NUL & move %rrr% ..\apr\ ) cd C:\uarm2\exg\out\ if exist %rrr% for /L %%i in ( 1,1,10000 ) do echo %%i>NUL rem г¤*<_-Ё_ б двЁЇЁ if exist %r% for %%f in ( %r% ) do ( call %h%transp.bat OUT delete %%f & copy %%f C:\svk\UOS_OUT\ ) if exist %r% for %%f in ( %r% ) do ( call %h%transp.bat send put %%f & move %%f ar\ ) if exist %rr% for %%f in ( %rr% ) do ( call %h%transp.bat OUT delete %%f & copy %%f C:\svk\UOS_OUT\ ) if exist %rr% for %%f in ( %rr% ) do ( call %h%transp.bat send put %%f & move %%f ar\ ) if exist %rrr% for %%f in ( %rrr% ) do ( call %h%transp.bat OUT delete %%f & copy %%f C:\svk\UOS_OUT\ ) if exist %rrr% for %%f in ( %rrr% ) do ( call %h%transp.bat send put %%f & move %%f ar\ ) set t=%TIME:~0,2% if %g%.==ok. if /i %t% LEQ 6 set z=yes rem ў_бм ¤_-м ЇаRбвR жЁЄ<Ё┐, * ЇRб<_ 0 з*бRў... if /i %t% GEQ 6 goto Loop rem _б<Ё -Rзм ЇRб<_ 3 Ё z=yes в._. д*c<л ЇаЁ-Ё┐*<Ёбм ¤R 6 гва*- *ў_аи*_┐ if /i 3 LEQ %t% if %z%.==yes. goto stop goto Loop :stop echo ### EXIT:%TIME% >>%h%log :Ar cd C:\uarm2\exg\!in\ & ren ar 20%a% & md ar cd C:\uarm2\exg\chk\ & ren ar 20%a% & md ar cd C:\uarm2\exg\out\ & ren ar 20%a% & md ar cd C:\uarm2\stg\err\ & ren ar 20%a% & md ar for /L %%i in ( 1,1,200000 ) do echo %%i>NUL shutdown /f /s |
Отправлено: 11:04, 19-02-2013 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - БАтник для переноса файлов и обратно | saha1010 | Скриптовые языки администрирования Windows | 3 | 04-09-2011 11:15 | |
CMD/BAT - [решено] батник для копирования файлов из ряда поддиректорий | xumuk032 | Скриптовые языки администрирования Windows | 3 | 27-04-2010 21:23 | |
Прочие - Программа для сравнения файлов в различных каталогах | shadowmaster63 | Программное обеспечение Windows | 3 | 14-04-2010 10:28 | |
Алгоритм сравнения бинарных файлов | Savant | Программирование и базы данных | 2 | 04-05-2005 09:57 |
|