用 Compare-Object 即可,它是 PowerShell 专为对象集合比对设计的核心 cmdlet,能识别属性、处理对象结构、标记差异方向,支持按属性比对、大小写敏感、排除差异或提取共有项,并需注意空值与类型一致性。
用 compare-object 就行,它是 powershell 专为对象集合比对设计的核心 cmdlet,不是简单字符串对比,而是能识别属性、处理对象结构、标记差异方向。
基础用法:直接比两组对象
最常用场景是比两个数组、文件内容或命令结果。关键点是明确哪边是“参考”(ReferenceObject),哪边是“差异”(DifferenceObject):
- 左边(
<=)表示只在参考对象中存在 - 右边(
=>)表示只在差异对象中存在 - 默认不显示两边都有的项;如需保留共有的,加
-IncludeEqual,会标为==
例如比两个文本文件的行:
Compare-Object -ReferenceObject (Get-Content a.txt) -DifferenceObject (Get-Content b.txt)
按指定属性比对(推荐用于自定义对象)
原始对象若含多个属性(比如服务、进程、AD用户),直接比整个对象可能因时间戳、内存地址等干扰而误判。这时用 -Property 指定关键字段:
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
- 只比名称和状态:
Compare-Object $svc1 $svc2 -Property Name,Status - 支持计算属性,比如统一格式后比较:
-Property @{e={$_.Name.ToUpper()}} - 加
-CaseSensitive可启用大小写敏感(默认不敏感)
获取干净结果:排除差异 / 只取共有项
日常运维常需要“两个列表里都有的东西”,而不是一堆 <= 和 =>:
- PowerShell 7.1+:用
-ExcludeDifferent,自动启用-IncludeEqual,输出只有==行 - 旧版本兼容写法:
Compare-Object $a $b -IncludeEqual | Where-Object SideIndicator -eq '==' - 想导出共有的 Name 列?接管道:
| Select-Object -ExpandProperty InputObject
注意对象为空或类型不一致的情况
Compare-Object 对 $null 敏感——任一输入为 $null 会报终止错误:
- 先检查:
if ($null -notin $a, $b) { Compare-Object $a $b } - 空数组可用
@()替代$null避免中断 - 若对象类型差异大(如一边是字符串,一边是 PSCustomObject),建议先用
Select-Object或ForEach-Object统一结构再比

















