比较对象给出了错误的差异

我有一些比较对象的问题。 我的任务是在不同的时间取得两个目录快照的区别。 第一个快照是这样的:

ls -recurse d:\dir | export-clixml dir-20100129.xml 

然后,稍后,我得到第二个快照并加载它们两个:

 $b = (import-clixml dir-20100130.xml) $a = (import-clixml dir-20100129.xml) 

接下来,我试图比较比较对象,就像这样:

 diff $a $b 

我得到的是某些地方的文件被添加到$ b,因为$ a,但是在一些文件中,在两个快照中,一些文件被添加到$ b,在Compare-Object输出中没有给出。 令人费解,但$ b.count – $ a.count与(diff $ a $ b).count完全相同。 这是为什么?

好的,比较对象具有-property参数。 我尝试使用:

 diff -property fullname $a $b 

我得到了所有的差异:它显示了所有的文件。 例如,说$ a包含:

 A\1.txt A\2.txt A\3.txt 

$ b包含:

 X\2.mp3 X\3.mp3 X\4.mp3 A\1.txt A\2.txt A\3.txt 

差异输出是这样的:

 X\2.mp3 => A\1.txt <= X\3.mp3 => A\2.txt <= X\4.mp3 => A\3.txt <= A\1.txt => A\2.txt => A\3.txt => 

奇怪的。 我认为我不明白比较对象使用的重要性,手册也很less…请帮助我获得两个目录快照之间的差异 。 提前致谢

更新:我已经将数据保存为像这样的纯string:

 > import-clixml dir-20100129.xml | % { $_.fullname } | out-file -enc utf8 a.txt 

结果是一样的。 这里是两个快照(前100行,a.txt和b.txt)的摘录,compare-object的输出和UNIX diff(统一)的输出。 所有文件都是UTF-8: http : //dl.dropbox.com/u/287​​3752/compare-object-problem.zip

可以使用-SyncWindow参数来解决问题。 值应该是最小集合的一半长度比较:

 > Compare-Object -SyncWindow ($a.length / 2) $a $b 

资料来源: http : //dmitrysotnikov.wordpress.com/2008/06/06/compare-object-gotcha/

这是由于export-clixml / import-clixml。 它实际上将每个文件对象的types从System.IO.FileSystemInfo更改为Deserialized.System.IO.FileInfo。

让你的第二个LS命令export-clixml到一个临时文件,然后导入和比较,它应该解决这个问题。

我发现的一个很好的例子就是这个。

获取服务的原始状态:

 $before = get-service 

现在对服务进行一些更改,例如closures1并启动1。

获取服务的新状态:

 $after = get-service 

然后比较两个列表(diff是比较对象的别名):

 diff $before $after -property name,status 

示例结果:

 PS> diff $before $after -property name,status name status SideIndicator ---- ------ ------------- Spooler Stopped => Spooler Running <= 

使用a =>显示第一个对象与<=,更改的第二个对象。 或者只是一个前后视angular。 你也可以创build一个标签和expression式来显示单词“改变”,如果有一个=>。

使用这个,你也可以在比较中看到什么东西在第一个列表中,但是在第二个列表中。 很像查找不匹配的查询。

就我个人而言,如果你能先sorting的话,我发现diff的效果更好

尝试

 $b = (import-clixml dir-20100130.xml) | sort $a = (import-clixml dir-20100129.xml) | sort diff $a $b