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 缓解。