Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник для сравнения файлов

Ответить
Настройки темы
CMD/BAT - [решено] Батник для сравнения файлов

Новый участник


Сообщения: 16
Благодарности: 2


Конфигурация

Профиль | Отправить PM | Цитировать


Всем привет!

Оч нужна ваша помощь.

Нужен батник для сравнения 2 х файлов по содержимому. Например с фтп копирую файлы, например в с:\tmp\, его копия копируется в архив. Например если в какой нибудь файлик в с:\tmp кто нибудь внес изменения, цифры например поменял или текст какой, то этот файлик нужно переместить в папку c:\error, а другие файлы переместить в папку с:\in и так циклически.

Заранее благодарю!!!
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:34, 13-02-2013

 

Новый участник


Сообщения: 16
Благодарности: 2

Профиль | Отправить 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Возможно. Но мне надо четкая постановка. »
В папку Tmp и TmpArc кладём не только файлы, но ещё и другие папки с файлами. То есть папки будут иметь структуру Tmp\Folder1, Tmp\Folder2\Folder3, TmpArc\Folder1, TmpArc\Folder2\Folder3 Задача: проанализировать все папки включая подпапки, не указывая путь к ним: Set TmpFtp=D:\Tmp , а анализировать все подпапки в текущем каталоге: Set TmpFtp=.\Tmp, Set TmpArc=.\TmpArc При совпадении файлов, фалы переносятся в: .\TmpIn и если файлы находятся ещё в подпапке, то папки создаются автоматически: TmpIn\Folder1, TmpIn\Folder1\Folder2 и файлы переносятся в эту папку. Анолагично и с: TmpErr
Такое возможно?

Отправлено: 12:13, 16-02-2013 | #12


Ветеран


Contributor


Сообщения: 2729
Благодарности: 1697

Профиль | Отправить 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
)
Я, кроме того, сделал решение более эффективным. При сравнении больших отличающихся файлов команда fc работает долго. Я сделал предварительный контроль длины файла. Если длины файлов не совпадают - значит они разные. Если не получится и с этим решением, сделайте для отладки Echo On, уберите перенаправления вывода >nul и просмотрите ошибочные сообщения. До возможной причины аварийного сообщения в предыдущем решении пока не докапывался, такое ощущение, что моё решение находится внутри внешнего цикла другого батника.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-02-2013 в 13:40.


Отправлено: 13:22, 16-02-2013 | #13


Ветеран


Contributor


Сообщения: 2729
Благодарности: 1697

Профиль | Отправить 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
)
Аккуратно замените мои пути D:\Tmp D:\TmpArc D:\TmpErr D:\TmpIn на свои в коде

orgia, В личном сообщении Вы писали
Цитата:
Может имеет значение что у мну стоит win7 64x? Я по пооду отработки первого варианта пакетника?
А второй пишет, что не найден пакетный файл CompMove
У меня нет в близком доступе такой системы, не берусь вникнуть в эту проблему. Обнародовал личное сообщение в надежде, что кто-то более сведущий сможет Вам помочь.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-02-2013 в 16:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:05, 16-02-2013 | #14


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


megaloman
Цитата megaloman:
Ваше второе сообщение не очень коррелирует с первым. »
Это просто уже другая мысль, на предыдущее сообщение я не смотрел... Всё верно! Работает как надо! Только как сделать это всё в текущем каталоге, т.е. там, где находиться сам bat-ник? С предыдущим примером - всё просто:
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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Tco 03:
Только как сделать это всё в текущем каталоге, т.е. там, где находиться сам bat-ник? »
Tco 03, у Вас опасное заблуждение о том, что текущий каталог==каталогу, в котором расположен пакетный файл. Это совершенно не так.
читать дальше »
Да, в ряде случаев они могут совпадать (например, когда Вы запускаете пакетный файл двойным щелчком из Проводника).

Текущий каталог: переменная окружения — «%CD%», ссылка с текущего каталога на самого себя — «.».

Каталог, где расположен пакетный файл: «%~dp0», где «%0» — псевдопеременная, замещающаяся именем/меткой пакетного файла, «~» — отбор возможных обрамляющих кавычек в имени, «d» и «p» — модификаторы для имени диска и пути псевдопеременной.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:46, 16-02-2013 | #16


Ветеран


Contributor


Сообщения: 2729
Благодарности: 1697

Профиль | Отправить 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


далее кусок предыдущего решения
Цитата:
Второй пример работает 50/50 он оставляет файлы в папке Tmp
- заархиваруйте и перешлите Ваши батник и папки - вы меня заинтриговали. Похоже, у Вас нарушено моё предположение, следующее из условия: в архивной папке ОБЯЗЯТЕЛЬНО должен быть файл с тем же именем, что и в ТМП. Вот код, где файлы, которых нет в тмп, переместятся в ошибочные, как это сделано и в решении с поддиректориями
читать дальше »
Код: Выделить весь код
@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

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 (
	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 в 18:42.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:08, 16-02-2013 | #17


Новый участник


Сообщения: 16
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата megaloman:
orgia, В личном сообщении Вы писали
Цитата:
Может имеет значение что у мну стоит win7 64x? Я по пооду отработки первого варианта пакетника?
А второй пишет, что не найден пакетный файл CompMove
У меня нет в близком доступе такой системы, не берусь вникнуть в эту проблему. Обнародовал личное сообщение в надежде, что кто-то более сведущий сможет Вам помочь. »
Благодарю за старания. Буду пробовать в понедельник на работе на xp. Если и там не поедет есть надежда на дальнейшее содействие?

Отправлено: 18:41, 16-02-2013 | #18


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


megaloman
Цитата megaloman:
в архивной папке ОБЯЗЯТЕЛЬНО должен быть файл с тем же именем, что и в ТМП. Вот код, где файлы, которых нет в тмп, переместятся в ошибочные »
СЕЙЧАС ВСЁ В ПОРЯДКЕ! Я его просто пару раз до этого прокрутил и он оставил половину файлов в tmp, ну я его и не стал дальше крутить.
Благодарю за помощь!

Отправлено: 19:34, 16-02-2013 | #19


Новый участник


Сообщения: 16
Благодарности: 2

Профиль | Отправить 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 /userperator 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

Отправлено: 11:04, 19-02-2013 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник для сравнения файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход