![]() |
Батник для сравнения файлов
Всем привет!
Оч нужна ваша помощь. Нужен батник для сравнения 2 х файлов по содержимому. Например с фтп копирую файлы, например в с:\tmp\, его копия копируется в архив. Например если в какой нибудь файлик в с:\tmp кто нибудь внес изменения, цифры например поменял или текст какой, то этот файлик нужно переместить в папку c:\error, а другие файлы переместить в папку с:\in и так циклически. Заранее благодарю!!! |
Для этого существует команда fc
Синтаксис команды можно посмотреть fc /? При отсутствии различий в файлах она возврвщает ErrorLevel=0, что можно потом проанализировать и предпринять дальнейшие действия. Код:
@echo off |
Цитата:
|
Спасибо за помощь, мне нужно сравнить ряд файлов в этих папках, туда сваливаю несколько файлов разных одновременно и сравнивать надо те что на с:\tmp\ c другими которые в архиве. В случае несовпадения одного файла из нескольких, этот файл нужно в еррор свалить а которые не изменились оставить. Я пробовал с помощью программы comp.exe. Она сравнивает их корректно, но я не могу применить результат.
|
orgia, Я понял так, что сравнивать надо файл в TMP и файл с таким же именем в архиве? Это можно сделать так
Код:
@echo off Цитата:
Или Вам надо каждый файл в tmp сравнить со всеми файлами в архиве и найти / не найти совпадение? Iska, Не стреляйте в пианиста, он играет, как умеет. Уровень Ваших знаний выше. Спасибо за помощь |
Цитата:
Файлы копируются из одного места в 2 разных папки. У меня есть требование перед обработкой их на c:\tmp проверить на идентичность их в архиве. И только после сравнения кидать на обработку. Как то так. |
Цитата:
|
спасибо, но он некорректно работат. при 2х одинаковых файлах в in не переносит.
пишет достигнут уровень рекурсии, максимальный возможный для данной команды setlocal и на этом все. |
megaloman
Очень хороший код, как раз то, что я искал! А возможно ли создать папки автоматически? То есть в папке Tmp находятся не только файлы, но ещё и другие файлы в подпапках. И создать точно такую же структуру папок, в папках: TmpArc, TmpErr, TmpIn, и потом удалить все папки (с подпапками (вместе с файлами)), кроме папки: TmpErr Ну или на крайний случай, как создать структуру папок мануально и потом их удалить? Сорри если туплю - я не силён в написании bat-ников. |
orgia, Что делает моё решение:
Сравнивает файл из D:\Tmp с одноименным файлом в архиве D:\TmpArc. Если файлы совпадают, перемещаю файл из D:\Tmp в D:\TmpIn Иначе в папку D:\TmpErr И так циклически. Еще раз проверил - работает, переносит всё куда надо в зависимости от совпадения/несовпадения. Возможно, Вы некорректно указываете пути в батнике - самая распространённая проблема, когда в определении пути в конце имеются пробелы. Для отладки попробуйте вариант Код:
@echo on И вообще, смысл задачи ускользает. В норме у Вас пара файлов с одинаковыми именами в тмп и архиве, в норме они идентичны. В тмп пользователь может изменить файл, в архиве - эталон. Если в тмп пришел файл, одновременно он пришел и в архив (по условию Вашей задачи) Нам всё равно, что творится с содержимым файла в тмп, главное, пришел файл, его надо обработать, и файл для обработки будем копировать в Ин из архива (где заведомо правильный файл). А в ТМП файл просто удаляем. Смысла сравнивать файлы вообще не вижу. Tco 03, Возможно. Но мне надо четкая постановка. |
Кинул один и тот же файл в 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:\> |
Цитата:
Такое возможно? |
orgia, Мне не удалось повторить Вашу ситуацию, было бы полезным получить от Вас живые файлы. Попробуйте вариант
Код:
@echo off |
Tco 03, Ваше второе сообщение не очень коррелирует с первым. Итак решение ИМХО с условием, совпадающем с предыдущим (как я его понял во втором сообщении):
Есть папка Tmp и TmpArc. Сравниваем файл из D:\Tmp с одноименным файлом в архиве D:\TmpArc. Если файлы разные или в D:\TmpArc его нет, то из D:\Tmp перемещаем файл в D:\TmpErr Если файлы одинаковые, то перемещаем в D:\TmpIn Единственное отличие, файлы могут содержаться в поддиректориях и при перемещении структуру директорий надо сохранить. Код:
@echo off orgia, В личном сообщении Вы писали Цитата:
|
megaloman
Цитата:
Set TmpFtp=.\Tmp Set TmpArc=.\TmpArc Set TmpErr=.\TmpErr Set TmpIn=.\TmpIn Вот со вторым... Просто мне (желательно нужно) чтобы он работал в самой папке, а не до пути к букве диска. Ну ето уже не так уж важно. В любом случаи благодарю за помощь! orgia У меня стоит win7 64x - первый пример работает как надо. Второй пример работает 50/50 он оставляет файлы в папке Tmp Может конечно так и нужно, но первый пример ничего не оставляет в этой папке. Последний пример работает на ура! Переносит все файлы и создаёт точно такие-же папки. |
Цитата:
|
Если у Вас есть каталог, в котором батник и в котором папки Tmp TmpArc TmpErr TmpIn, то вот кусок кода, который надо вставить в предыдущее решение (ограничение: в папке Tmp ни на каком уровне не должно быть подпапки c совпадающим именем Tmp)
Код:
@echo off Цитата:
|
Цитата:
|
megaloman
Цитата:
:bow: Благодарю за помощь! |
Привет!
Все нормально. проверил на другом ПК, все отрабатывает на УРА. МЕГАреспект!!!! Но возник у меня трабл. Не могу корректно прикрутить в мой батник. Идея такова. Есть входной каталог 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:operator c:\uarm2\bin\uarm) else (uarm.lnk) 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 |
orgia, научитесь уже пользоваться тэгом [code].
|
orgia, я не вчитывался в Ваш код, я не читатель, а писатель :) но как вариант моего решения для Вашей постановки
Код:
@echo off |
Благодарю, попробую внедрить Ваш батник в свой. И еще просьба подсказать. Как корректней указать путь к архивной папке в Вашем батнике. В
вашем Set TmpArc=D:\TmpArc а мне нужно X:\\Appl\Archive\ГГММДД\out\*.* вот до сюда. И как обработает батник файлы, если сначала упадут файлы Set TmpFtp=D:\Tmp, затем Set TmpArc=D:\TmpArc. Если эти файлы моим батником подтянутся еще раз он сравнение корректно сделает? |
Код:
Set TmpArc=X:\Appl\Archive\%Date:~8,2%%Date:~3,2%%Date:~0,2%\out Цитата:
|
большое спасибо за помосчь!!! Ошибка при проверке ошибка FC: cannot open F:\Archive\130305\out\I0505805 - no such file or folder cannot be found. Доступ есть. Может из за того что диск подмапенный?
|
Цитата:
|
неа, не помогло. тем более решение для 7. обкатываю на 7 батник а работать бкит на xp/
вот этим батником обрабатывается @echo off Set TmpFtp=D:\Tmp Set TmpArc=F:\ARCHIVE\%Date:~8,2%%Date:~3,2%%Date:~0,2%\out Set TmpErr=D:\TmpErr Set TmpIn=D:\TmpIn Set Mask1=I%Date:~0,2%05805.??? Set Mask2=L01???????????.0?? Set Mask3=5005805?????????????????.dat Set Mask=5005805000%Date:~0,2%???.ED Move /Y "%TmpFtp%\%Mask%" "%TmpIn%\" >nul CD /D "%TmpFtp%" SetLocal EnableExtensions EnableDelayedExpansion FOR %%f IN ("%Mask1%" "%Mask2%" "%Mask3%") DO ( fc /B "%%f" "%TmpArc%\%%~nxf" >nul If !ErrorLevel!==0 ( Move /Y "%%f" "%TmpIn%\" >nul ) Else ( Move /Y "%%f" "%TmpErr%\" >nul ) ) |
:CompMove
If Not Exist "%2" GoTo :Eof - не работает зараза.:) обработка на этом заканчивается всего батника, дальше не обрабатывает. |
В спешке отвечал на Ваше PM на автопилоте (задачу уже не помнил) Попробуйте, тестировал, работает
Код:
@echo off |
Спасибо, работает. И такой вопрос еще. я вызываю на исполнение Ваш файлик командой call. И ситуация такая, что батник уменя циклический, и постоянно вызывается даже при отсутствии во входном каталоге каких либо файлов. В принципе ничего фатального в этом нет, но хотелось бы причесать. Как вызывать ваш батник тлько при наличии во входном каталоге? У мну што то не совсем все получается.????
|
Цитата:
|
Всем спасибо!
|
Время: 16:08. |
Время: 16:08.
© OSzone.net 2001-2025