Большинство команд возвращают код ошибки по завершении. По соглашению, нуль приравнивается к успеху, а отличное от нуля означает отказ (это общее правило - есть исключения). Поэтому большая часть этого ответа может быть применена к любой команде, если вы знаете, как интерпретировать возвращенный код ошибки.
Команда FC возвращает 0, если файлы совпадают, и 1 есть хотя бы одно различие. Вам не нужно видеть вывод команды (различия), поэтому вы можете перенаправить stdout на nul.
Одним из вариантов является использование IF ERRORLEVEL N, который будет истинным, если возвращенный код ошибки> = N.
fc ActiveVer.txt CurrentVer.txt >nul
if errorlevel 1 goto outOfDate
echo you are Up-To-Date
exit /b
:outOfDate
echo you are Out-Of-Date
exit /b
Обратите внимание, что %cd%\file
и file
эквивалентны - %cd%
не требуется.
Другой вариант - проверить конкретное значение с помощью динамической переменной% ERRORLEVEL%.
fc ActiveVer.txt CurrentVer.txt >nul
if %errorlevel%==1 goto outOfDate
echo you are Up-To-Date
exit /b
:outOfDate
echo you are Out-Of-Date
exit /b
Но я почти никогда не использую ни синтаксиса выше. Вместо этого я использую операторы конкатенации условных команд &&
и ||
. Команды после &&
выполняются только в том случае, если предыдущая команда возвратила нуль, а команды после ||
выполняются, если команда возвращает ненулевое значение. Обратите внимание, что команды после &&
могут выйти из строя, что может привести к срабатыванию команд ||
, даже если исходная команда выполнена успешно. По этой причине рекомендуется прекратить выполнение команд &&
с гарантией успеха. Хороший выбор - (call)
, который ничего не делает, кроме возврата 0 (успех).
someCommand && (
REM Success commands go here
REM Make sure the last commmand in this block returns 0
(call)
) || (
REM Error commands go here
)
Вы просто хотите GOTO, если ФК «терпит неудачу» (находит разницу), поэтому вам нужно только ||
.
fc ActiveVer.txt CurrentVer.txt >nul || goto outOfDate
echo You are Up-To-Date
exit /b
:outOfDate
echo You are Out-Of-Date
Ничего себе! Спасибо. Я почти забыл об уровне ошибок. Из большинства вещей, которые я сделал, я всегда избегал использования ERRORLEVEL, зная, что это может быть иногда опасно. Также я рад, что вы показали еще один способ добиться этого. –