1

我有两个 .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
    )
    )
4

2 回答 2

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为:

名字=第一个值
秒名=秒值
第三名=第三个值
第五个名字=第五个值
第七名=第七值

应 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
于 2013-05-29T06:15:45.550 回答
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

我使用斜线来分隔属性名称。如果此字符可能出现在名称中,只需在程序中选择一个不同的字符即可。

以前的解决方案消除了文件中的任何感叹号;如果需要,这个细节可能会被修复。

于 2013-05-29T12:55:47.857 回答