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

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

Ответить
Настройки темы
CMD/BAT - [решено] Сравнение двух файлов>ветвление "fc" или "diff"

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


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

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


Использую "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" то же ноль
Какие есть альтернативы?

Отправлено: 18:19, 06-07-2009

 

Ветеран


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

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


Вложения
Тип файла: zip bincomp.zip
(24.6 Kb, 65 просмотров)

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

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

Отправлено: 18:38, 06-07-2009 | #2



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

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


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


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

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


Все равно получаю нули
В тестовом все отлично
Код: Выделить весь код
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%

Отправлено: 20:11, 06-07-2009 | #3


Ветеран


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

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


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

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

Последний раз редактировалось Iska, 06-07-2009 в 20:37.

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

Отправлено: 20:25, 06-07-2009 | #4


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


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

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


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


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

Отправлено: 23:02, 06-07-2009 | #5



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Как удалить папку "Моя музыка","Мои Картинки", "Мое видео"? verdix Microsoft Windows 2000/XP 3 03-10-2009 23:46
[решено] Переменные среды папок "Мои рисунки", "Моя музыка" или общие Redew Автоматическая установка Windows 2000/XP/2003 9 03-10-2009 20:43
Разное - [решено] Вместо "Мой компьютер" или при двойном щелчке на папке открывается "Поиск" ZoolooS Microsoft Windows 2000/XP 4 18-06-2008 16:34
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") submaster Microsoft Windows NT/2000/2003 5 13-09-2006 12:29
Когда нажимаю букву"M" или "L","U"...Проблема.. ekodrive Microsoft Windows 2000/XP 7 27-01-2006 15:13




 
Переход