Войти

Показать полную графическую версию : [решено] Сравнение двух файлов>ветвление "fc" или "diff"


dARKest
06-07-2009, 18:19
Использую "GNU utilities for Win32"
В частности md5sum.exe, wget

Задача: Скачивать данные с FTP, предварительно проверив нужна новая закачка или докачка, или вообше не нужно скачивать.

Есть FTP сервер с данными
для каждого файла есть файл с ".md5" (их скачиваю каждый раз без условий)

На клиенте:
дирректория с данными c:\1\data\
для всех файлов которые были скачаны в прошлый раз посчитаны md5 и сложены в c:\1\local\
все md5 с сервера прошлой закачки в c:\1\old\



UserPass_ftp=ftp:ftp
set ftp_ip=10.8.0.26
set ftp_path=/data/
set path_local_data=c:\1\data\

rem Посчитать локальные MD5
del .\local\*.md5
for %%i in (*.*) do md5sum.exe %%i > .\local\%%i.md5

rem Переместить старые серверные MD5
move /Y *.md5 ./old

rem Скачать новые MD5 с сервера
wget -t2 ftp://%UserPass_ftp%@%ftp_ip%%ftp_path%md5/*.md5

REM сравнить MD5 с сервера со старым
for %%i in (*.md5) do (
fc %%i .\old\%%i
echo %ERRORLEVEL%
if %ERRORLEVEL%==1 do (
set tempname=%path_local_data%%%i
)
)



Вопрос в том что ERRORLEVEL всегда ноль.

Идея исользовать ERRORLEVEL пришла от diff в NIX системах
Команда diff возвращает код завершения 0, если сравниваемые файлы идентичны и 1, если они отличаются. Из "GNU utilities for Win32" то же ноль :(
Какие есть альтернативы?

Iska
06-07-2009, 18:38
Я для этих целей давно использую «Binary Compare» Steven'а Wettberg'а:
Syntax: BinComp [FILE1] [FILE2] [/Q]

/Q is an optional parameter that turns off informational messages

Returns ERRORLEVEL 0 if they are the same
Returns ERRORLEVEL 1 if [FILE1] does not exist
Returns ERRORLEVEL 2 if [FILE2] does not exist
Returns ERRORLEVEL 3 if they are different

Example: BinComp c:\somefile.exe c:\windows\somefile.exe /Q

Поскольку сайт с этой загрузкой сейчас недоступен, вкладываю оригинальный архив в сообщение, можете попробовать.

dARKest
06-07-2009, 20:11
Все равно получаю нули
В тестовом все отлично

BinComp.exe calendar.xml.md5 calendar.xml.md51
echo %ERRORLEVEL%

Результат

C:\1>BinComp.exe calendar.xml.md5 calendar.xml.md51
Running Comparison.....
The files are different.
3


В случае же цикла

@echo off
for %%i in (*.md5) do (
echo BinComp.exe %%i .\old\%%i
BinComp.exe %%i .\old\%%i
echo %ERRORLEVEL%
)

Результат

BinComp.exe calendar.xml.md51 .\old\calendar.xml.md51
.\old\calendar.xml.md51 does not exist!
0
BinComp.exe clients.bin.md5 .\old\clients.bin.md5
.\old\clients.bin.md5 does not exist!
0
BinComp.exe debtors.xml.md5 .\old\debtors.xml.md5
Running Comparison.....
The files are different.
0
BinComp.exe hallmap.xml.md5 .\old\hallmap.xml.md5
Running Comparison.....
The files are the same.
0


Та же проблема что и при использовании diff из "GNU utilities for Win32"
Внутри цикла как то иначе устанавливает %ERRORLEVEL%

Iska
06-07-2009, 20:25
Всё правильно. Дело в том, что требуется:
setlocal enabledelayedexpansion
в начале пакетного файла, и:
echo !ERRORLEVEL!
вместо:
echo %ERRORLEVEL%
поскольку в приведённом контексте [внутри скобок] для правильной работы требуется отложенное раскрытие переменной ERRORLEVEL (%ERRORLEVEL% же будет раскрыта один раз при входе в скобки).

Update: прошу прощения, проглядел сразу про использование Вами diff.exe: при указанных выше изменениях будет видно, что он также работает корректно.

dARKest
06-07-2009, 23:02
Только об этом подумал. Спасибо за приданный импульс в правильном направлении.
Все варианты BinComp.exe, diff.exe, и windows fc.exe дают ожидаемый результат. Для моей задачи буду использовать fc.exe.


P.S.Автор должен закрыть тему? Где?




© OSzone.net 2001-2012