PowerShell中Compare-Object对比Clixml导入与实时服务对象异常问题
产生差异的核心原因
Compare-Object cmdlet 默认的比较逻辑,是先判断两个输入对象是否为同一个运行时实例引用,而非逐属性比对值是否一致,出现双向差异提示的本质是两边传入的根本不是同一个对象实例:
- 你通过
Import-Clixml读回来的对象,是从XML反序列化生成的静态快照对象,类型为Deserialized.System.ServiceProcess.ServiceController,不具备实时服务对象的方法,属性值是导出那一刻的固定值。 - 直接执行
Get-Service -Name bits拿到的是实时生成的System.ServiceProcess.ServiceController类型活对象,哪怕所有属性值和你导出的快照完全一致,它也是独立于反序列化对象的全新实例,默认比较逻辑会直接判定二者不相等。
你用fc命令对比两个导出的XML文件没发现差异,是因为fc做的是纯文本/字节级的文件内容比对,两次导出间隔内BITS服务的属性没有发生变化,所以两个XML内容完全一致,这个比对逻辑和PowerShell的对象实例比对逻辑完全无关。
正确的比对方式
如果要按属性值判断两个服务对象是否一致,给Compare-Object加上-Property参数,明确指定要比对的属性即可,例如:
# 指定按服务名、运行状态、启动类型三个核心属性比对 Compare-Object -ReferenceObject (Import-Clixml -Path .\example.xml) -DifferenceObject (Get-Service -Name bits) -Property Name,Status,StartType
执行后如果指定属性的值完全一致,就不会返回任何差异结果。
你也可以做个简单验证:哪怕是两个同内容的反序列化对象,只要是两次独立导入生成的实例,默认比较也会判定为存在差异:
# 两次导入同一个XML文件,生成两个独立实例 $obj1 = Import-Clixml .\example.xml $obj2 = Import-Clixml .\example.xml # 默认比较,照样会返回双向差异 Compare-Object $obj1 $obj2
内容的提问来源于stack exchange,提问作者Riccardo79
相关产品推荐
相关产品推荐

