我想使用 比较 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