我有两个.properties文件,如下所示
first.properties second.properties
----------------- ---------------------
firstname=firstvalue fourthname=100100
secondname=secondvalue sixthname=200200
thirdname=thirdvalue nineththname=ninethvalue
fourthname=fourthvalue tenthname=tenthvalue
fifthname=fifthvalue
sixthname=sixthvalue
seventhname=seventhvalue
我想比较两个带有名称的文件,需要从first.properties中删除通用名称和相应的值。输出文件应为
third.properties.
------------------
firstname=firstvalue
secondname=secondvalue
thirdname=thirdvalue
fifthname=fifthvalue
seventhname=seventhvalue
我使用了以下代码,但是它给出了笛卡尔产品方案。请你帮助我实现上述目标。
for /F "tokens=1,2 delims==" %%E in (first.properties) do (
for /F "tokens=1,2 delims==" %%G in (second.properties) do (
if "%%E" NEQ "%%G" echo %%E=%%F>>!HOME!\Properties\third.properties
)
)
答案 0 :(得分:1)
试试这个:
@echo off
(for /f "delims==" %%i in (second.properties) do echo(%%i.*)>temp.properties
findstr /rvg:temp.properties first.properties>third.properties
del temp.properties
.. third.properties
中的输出是:
firstname=firstvalue secondname=secondvalue thirdname=thirdvalue fifthname=fifthvalue seventhname=seventhvalue
根据OP的要求我添加一个(慢得多)没有临时文件的解决方案:
@echo off
(for /f "tokens=1,2delims==" %%i in (first.properties) do findstr /r "%%i.*" second.properties >nul||echo(%%i=%%j)>third.properties
type third.properties
答案 1 :(得分:0)
下面的批处理文件不会创建临时文件,也不会使用外部命令(如findstr.exe),因此运行速度更快。
@echo off
setlocal EnableDelayedExpansion
rem Create list of names in second file
set "secondNames=/"
for /F "delims==" %%a in (second.properties) do set "secondNames=!secondNames!%%a/"
rem Copy properties of first file that does not appear in second one
(for /F "tokens=1* delims==" %%a in (first.properties) do (
if "!secondNames:/%%a/=!" equ "%secondNames%" (
echo %%a=%%b
)
)) > third.properties
我使用斜杠来分隔属性名称。如果此字符可能出现在名称中,只需在程序中选择另一个字符。
先前的解决方案消除了文件中的任何感叹号;如果需要,可以修复此细节。