PowerShell中如何简单实现检测数组所有元素是否完全相同?
PowerShell判断数组所有元素是否完全一致的实现方案
需求说明
需要判断数组内所有元素是否完全相等,支持对象、字符串、数值、XML等所有常见数据类型。
原有实现的缺陷
你目前的代码主要存在两个问题:
- 直接使用
-ne运算符比较元素,对于引用类型(如自定义对象、数组、XML节点)默认只会对比内存引用地址,不会校验实际内容,只要不是同一个实例就会返回不相等,不符合内容对比的需求 - 基准值初始化逻辑有问题:如果数组第一个元素是
$null、0、空字符串这类隐式转换为布尔值为假的元素,会导致基准值赋值逻辑异常
解决方案
单行快速实现(简单场景适用)
可以直接调用PowerShell内置的Compare-Object命令实现,无需自定义函数:
# 数组所有元素和第一个元素无差异时返回$true,否则返回$false $allEqual = $null -eq (Compare-Object -ReferenceObject $Array[0] -DifferenceObject $Array -Deep)
注:
-Deep参数需要PowerShell 7及以上版本支持,可实现引用类型的深度内容对比;如果是PowerShell 5.1环境,仅对比值类型、字符串的话可以去掉该参数。
优化后的通用函数
如果需要兼容空数组、单元素数组等边界场景,可使用如下实现:
function Test-ArrayElementsEqual { [CmdletBinding()] param ( [Parameter(Mandatory, Position = 0, ValueFromPipeline)] [object[]] $Array ) # 边界处理:空数组、只有1个元素的数组默认所有元素相等 if ($Array.Count -le 1) { return $true } $referenceItem = $Array[0] foreach ($currentItem in $Array[1..($Array.Count - 1)]) { if ($null -ne (Compare-Object -ReferenceObject $referenceItem -DifferenceObject $currentItem -Deep -ErrorAction SilentlyContinue)) { return $false } } return $true }
验证用例
你可以用以下场景测试功能:
- 数值数组:
Test-ArrayElementsEqual -Array @(1,1,1)返回$true - 字符串数组:
Test-ArrayElementsEqual -Array @("test","test","test")返回$true - 哈希表数组:
Test-ArrayElementsEqual -Array @(@{a=1},@{a=1},@{a=1})(PowerShell 7+环境)返回$true - 元素不一致的数组:
Test-ArrayElementsEqual -Array @(1,2,3)返回$false
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

