我有一些比较对象的问题。 我的任务是在不同的时间取得两个目录快照的区别。 第一个快照是这样的:
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/2873752/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