首页/系统/Windows 运维速查/Compare-Object 差异对比
PowerShell 基础66 条

Compare-Object 差异对比

对比两组对象的差异(基准 vs 目标),用于文件清单、服务列表、配置项的多机核对。

Windows 运维速查系统更新于 2026-10-13

Compare-Object 是什么

Compare-Object 比较两组对象的差异,标出只在一侧出现的项,常用于核对两台机器的服务清单、两个目录的文件列表或升级前后的配置项。输出用 SideIndicator 表示方向:小于等于号表示只在前一个集合,箭头指向表示只在后一个集合,双等号表示两侧都有(需要加 -IncludeEqual)。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7
语法Compare-Object -ReferenceObject 集合1 -DifferenceObject 集合2 [-Property 属性] [-IncludeEqual]
关键开关-IncludeEqual 同时输出一致项、-ExcludeDifferent 只输出一致项(需与前者搭配)、-CaseSensitive 区分大小写
输出对象含 InputObject 比较值与 SideIndicator 方向两列
比较文件比较文件内容或目录时可用 -SyncWindow 容忍顺序差异

典型使用场景

  • 对比两台服务器已安装服务或补丁清单,找出缺失项
  • 核对两个目录的文件名差异,定位多余与遗漏文件
  • 版本升级前后对比配置项列表,确认改动范围
  • 数据迁移后校验目标端是否多出或漏掉条目
  • 与导出的基线清单比对,做合规巡检

常用示例

常用示例
$a = Get-ChildItem D:\A -Name
$b = Get-ChildItem D:\B -Name
# 列出差异:只在 A 与只在 B 的项
Compare-Object $a $b
# 比较对象集合必须指定属性
Compare-Object (Get-Service Dnscache) (Get-Service dhcp) -Property Name
# 只挑出仅存在于第二个集合的项
(Compare-Object $a $b | Where-Object SideIndicator -eq '=>').InputObject
# 连一致项一起输出,便于全量核对
Compare-Object $a $b -IncludeEqual
# 导出结果便于留档
Compare-Object $a $b | Export-Csv D:\diff.csv -NoTypeInformation -Encoding UTF8

方向标记读法

标记含义下一步
仅左侧标记只在基准集合(第一个参数)出现目标端缺项,需要补齐
箭头标记只在对比集合(第二个参数)出现目标端多项,需要确认来源
双等号标记两侧都有,需要 -IncludeEqual 才显示内容一致,可直接放过
InputObject被比较的具体值用 Where-Object 过滤方向后再看它
SideIndicator差异方向排序或分组后差异更易读
比较纯字符串数组时可以不指定 -Property;一旦对象带有引用类型属性,不指定属性会把所有项都判成差异,因为比较的是对象引用而不是值。
结果默认不排序,差异多时建议先 Sort-Object 或导出 CSV 再比对;两侧集合顺序不一致造成的误报可以用 -SyncWindow 缓解。

易错点

  • 比较对象集合时不指定 -Property,会因为引用不同而全部报差异,看起来像完全不匹配
  • 默认比较不区分大小写,严格校验标识大小写的场景需要显式加 -CaseSensitive
  • 只写 -ExcludeDifferent 而不加 -IncludeEqual 不会得到预期结果,两者必须搭配使用
  • 两侧集合顺序不同会制造大量无意义差异,文件清单场景应先去重排序
  • 把输出直接当字符串使用会出错,它其实是带 InputObject 与 SideIndicator 的对象

数据来源与参考

  • Microsoft Learn:Compare-Object

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌