比较来自两个文件的文本,如果它们不同则做一些事情

Compare text from two files and do something if they are diffrent

所以我需要比较两个文本文件,如果其中一个文件的内容不同,则告诉批处理文件 GOTO Diffrence 我知道 FC 命令可以检查差异,但我可以使用它吗让它转到不同的地方

所以我运行 fc %cd%\ActiveVer.txt %cd%\currentver.txt

ActiveVer.txt 说: 0.5.6

和 currentver.txt 说: 0.5.7 fc 告诉我区别。

但我正在尝试查看并制作 运行 GOTO out-of-date 如果有差异,如果有 none.[=16= 则执行 echo You are up to date! ]

大多数命令 return 完成后出现错误代码。按照惯例,零等于成功,non-zero 等于失败(这是一般规则 - 也有例外)。所以这个答案的大部分都可以应用于任何命令,只要你知道如何解释 returned 错误代码。

FC 命令return如果文件匹配则为 0,如果至少有一处不同则为 1。您不需要查看命令的输出(差异),因此您可以将 stdout 重定向到 nul。

一个选项是使用 IF ERRORLEVEL N,如果 returned 错误代码 >= 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%\filefile 是等价的 - %cd% 不是必需的。

另一种选择是使用动态 %ERRORLEVEL% "variable".

检查特定值
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

但我几乎从不使用上述任何一种语法。相反,我使用条件命令连接运算符 &&||&& 之后的命令仅在前一个命令 return 为零时执行,而 || 之后的命令在命令 return 为 non-zero 时执行。请注意,&& 之后的命令可能会失败,这可能会导致 || 命令触发,即使原始命令成功也是如此。因此,最好以保证成功的命令结束 && 命令。一个不错的选择是 (call ),它除了 return 0(成功)之外什么都不做。

someCommand && (
  REM Success commands go here
  REM Make sure the last commmand in this block returns 0
  (call )
) || (
  REM Error commands go here
)

如果 FC "fails" 你只想转到 GOTO(发现不同),所以你只需要 ||.

fc ActiveVer.txt CurrentVer.txt >nul || goto outOfDate
echo You are Up-To-Date
exit /b

:outOfDate
echo You are Out-Of-Date