2015-12-30 1 views
1

Так что мне нужно сравнить два текстовых файла, и если есть разница в содержании в одном из них, то сообщите командный файл GOTO Diffrence. Я знаю, что команда FC может проверять diffrences, но я могу использовать его, чтобы сделать его Гото в diffrent местоСравните текст из двух файлов и сделайте что-нибудь, если они отличаются друг от друга

так я бегу fc %cd%\ActiveVer.txt %cd%\currentver.txt

ActiveVer.txt говорит: 0.5.6

и currentver.txt говорит: 0.5.7 fc говорит мне разницу.

Но я пытаюсь увидеть и запустить его GOTO out-of-date если есть разница и сделайте echo You are up to date!, если его нет.

  • Должен ли я запустить другую команду для этого или есть что-то, что позволяет мне делать это с помощью fc?

ответ

3

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

Команда 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 
+0

Ничего себе! Спасибо. Я почти забыл об уровне ошибок. Из большинства вещей, которые я сделал, я всегда избегал использования ERRORLEVEL, зная, что это может быть иногда опасно. Также я рад, что вы показали еще один способ добиться этого. –

Смежные вопросы