当没有差异时如何使用 fc 抑制输出

当没有差异时如何使用 fc 抑制输出

我想使用 比较 cmd.exe 批处理文件中的一组文件fc。不幸的是,fc如果没有差异,则每对比较的文件都会报告未发现任何差异。我该如何改变这种行为,使其在没有差异时保持沉默,并且仅在文件确实不同时报告?

答案1

我们可以按照以下方法检查 ERRORLEVEL 返回值FC。创建以下批处理文件:

test.cmd:

@echo off

rem create two temporary text files to compare
echo asdf > 1.txt
echo qwer > 2.txt

fc /b 1.txt 1.txt > nul 2>&1
echo Test1, errorlevel: %ERRORLEVEL%  / no differences encountered
fc 1.txt 2.txt > nul 2>&1
echo Test2, errorlevel: %ERRORLEVEL%  / different files
fc /b 1.txt 3.txt > nul 2>&1
echo Test3, errorlevel: %ERRORLEVEL%  / Cannot find at least one of the files
fc /b > nul 2>&1
echo Test4, errorlevel: %ERRORLEVEL% / Invalid syntax

rem cleanup
del 1.txt 2.txt

跑步test.cmd

结果:

Test1, errorlevel: 0  / no differences encountered
Test2, errorlevel: 1  / different files
Test3, errorlevel: 2  / Cannot find at least one of the files
Test4, errorlevel: -1 / Invalid syntax

综合起来:

compare.cmd:

@echo off
fc /b %1 %2 > nul 2>&1

If "%ERRORLEVEL%"=="1" (
  echo different!
  rem <- do whatever you need to do here... ->
)

If "%ERRORLEVEL%"=="0" (
  echo No difference!
)

If "%ERRORLEVEL%"=="2" (
  echo File not found
)
 
If "%ERRORLEVEL%"=="-1" (
  echo Invalid syntax
)

答案2

可以通过使用||仅当左侧命令的退出状态为 0 时才执行右侧命令的构造来实现。由于fc如果没有发现差异,其退出状态为 0,因此cat不会运行该命令。

fc file1.xyz file2.xyz > c:\temp\fc.out || cat c:\temp\fc.out

如果在批处理文件中使用,@则应在前面添加一个,以便不回显整行:

@fc %1 %2 > c:\temp\fc.out || cat c:\temp\fc.out

相关内容