PowerShell如何判断两个数组类型变量的取值是否完全相等?
问题原因分析
- 你用的
-match是正则匹配运算符,不适合做数组全等判断:当左值为数组时,-match会返回所有匹配正则规则的元素,而右值为数组时PowerShell会自动将其转换为类型字符串,完全不符合你的校验需求。 Compare-Object无输出不是没生效,而是两个数组完全相等时该命令默认没有返回值,你只需要补全判断逻辑即可。
正确校验方法
方法1:基于Compare-Object判断(推荐,适配绝大多数场景)
如果需要校验元素数量、值、顺序完全一致,直接判断Compare-Object的返回值是否为$null即可:
if ($null -eq (Compare-Object -ReferenceObject $todhome.tod_disk_type -DifferenceObject $todhome.actual_disk_type)) { Write-Host "两个数组完全相等" } else { Write-Host "两个数组存在差异" }
如果不需要校验顺序,只需要校验元素值和数量一致,添加-SyncWindow ([int]::MaxValue)参数即可:
if ($null -eq (Compare-Object $todhome.tod_disk_type $todhome.actual_disk_type -SyncWindow ([int]::MaxValue))) { Write-Host "两个数组元素完全匹配(忽略顺序)" }
方法2:字符串拼接后对比(适合简单字符串数组,写法简单)
选择不会出现在元素值中的分隔符,把两个数组拼接为字符串后直接对比:
# 用|作为分隔符,也可以换成其他不会出现在元素中的字符 $todDiskStr = $todhome.tod_disk_type -join '|' $actualDiskStr = $todhome.actual_disk_type -join '|' if ($todDiskStr -eq $actualDiskStr) { Write-Host "两个数组完全相等" }
方法3:逐元素对比(适合复杂类型数组,可控性最高)
先判断数组长度是否一致,再逐个对比对应位置的元素:
$todDisk = $todhome.tod_disk_type $actualDisk = $todhome.actual_disk_type $isEqual = $false # 先判断长度是否一致 if ($todDisk.Count -eq $actualDisk.Count) { $isEqual = $true # 逐元素对比 for ($i = 0; $i -lt $todDisk.Count; $i++) { if ($todDisk[$i] -ne $actualDisk[$i]) { $isEqual = $false break } } } if ($isEqual) { Write-Host "两个数组完全相等" }
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

