Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сравнение двух файлов>ветвление "fc" или "diff" (http://forum.oszone.net/showthread.php?t=144365)

dARKest 06-07-2009 18:19 1160368

Сравнение двух файлов>ветвление "fc" или "diff"
 
Использую "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 1160389

Вложений: 1
Я для этих целей давно использую «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 1160464

Все равно получаю нули
В тестовом все отлично
Код:

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 1160475

Всё правильно. Дело в том, что требуется:
Код:

setlocal enabledelayedexpansion
в начале пакетного файла, и:
Код:

echo !ERRORLEVEL!
вместо:
Код:

echo %ERRORLEVEL%
поскольку в приведённом контексте [внутри скобок] для правильной работы требуется отложенное раскрытие переменной ERRORLEVEL (%ERRORLEVEL% же будет раскрыта один раз при входе в скобки).

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

dARKest 06-07-2009 23:02 1160599

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


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


Время: 15:23.

Время: 15:23.
© OSzone.net 2001-