Сравнение пакетных файлов, возвращающее 0, если файлы разные - PullRequest
2 голосов
/ 30 марта 2012

Я использую систему планирования на сервере Windows 2003, для которой требуются командные файлы для запуска различных заданий.У меня есть одно задание, которое проверяет, существует ли файл, сравнивает ли оно, что файл не пустой, а затем что-то делает на основании результатов.Каждый раз, когда я запускаю это, уровень ошибки возвращается 0, но файлы разные.Я ожидаю увидеть возвращенное значение 1.

Я проверил расположение файлов, и в одном файле есть содержимое, а в другом пусто.Я установил приглашения, и все они говорят, что% ERRORLEVEL% равен 0. Я даже переместил файлы в тот же каталог в пакетном задании, но они по-прежнему показывают 0.

Код:

echo %ERRORLEVEL%
IF EXIST data.DON ( 
echo before %ERRORLEVEL%
    FC data.DON ZERO.SEQ
echo after %ERRORLEVEL%
    IF %ERRORLEVEL% EQU 1 GOTO :PROCESS
)

Вывод:

16:37:08.12 Thu 03/29/2012
>IF EXIST data.DON (
echo before 0  
 FC data.DON ZERO.SEQ  
 echo after 0  
 IF 0 EQU 1 GOTO :PROCESS 
) 
before 0
Comparing files data.DON and ZERO.SEQ
***** data.DON
Name|Date|Location    

***** ZERO.SEQ
*****

after 0

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

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Если вы замените значение любой переменной%% в круглых скобках , это значение будет таким же, как у переменной до , введите скобки:

set var=Old value
( set var=New value & echo %var% )

Предыдущий код всегда показывает: Старое значение

Чтобы решить эту проблему, вы должны использовать Delayed Expansion, то есть заключить переменную в восклицательные знаки вместо процентов и добавить команду SETLOCAL в начале:

setlocal EnableDelayedExpansion
set var=Old value
( set var=New value & echo !var! )

Все предыдущее описание также применимо к переменной errorlevel, поэтому замените все %errorlevel% на !errorlevel! в своем коде и вставьте предыдущий SETLOCAL ....

1 голос
/ 30 марта 2012

Правильный способ проверки errorlevel выглядит следующим образом:

IF EXIST data.DON ( 
    FC data.DON ZERO.SEQ
    IF ERRORLEVEL 1 GOTO :PROCESS
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...