PowerShell对比故障服务器列表,仅返回新增项的最优实现方式?
无需Where-Object过滤的实现方式
当然有,以下几种方法可以不用Compare-Object结合Where-Object的组合,直接得到今日独有的故障服务器:
方法一:直接筛选今日列表(简洁版)
利用-notcontains运算符直接在今日数据里过滤掉昨日已存在的服务器:
$TodaysData | Where-Object { $YesterdayData.Server -notcontains $_.Server }
这种写法直观易懂,适合数据量不大的场景。
方法二:哈希表优化(高性能版)
如果服务器列表数据量较大,-notcontains的遍历效率会降低,这时可以用哈希表存储昨日的服务器名,利用哈希表O(1)的查找性能提升速度:
# 先把昨日的服务器名存入哈希表 $yesterdayServerMap = @{} $YesterdayData | ForEach-Object { $yesterdayServerMap[$_.Server] = $true } # 筛选今日不在哈希表中的服务器 $TodaysData | Where-Object { -not $yesterdayServerMap.ContainsKey($_.Server) }
补充说明
你原来用Compare-Object的写法本身没问题,但如果想彻底避开对SideIndicator的过滤,上面两种方法更直接。其中哈希表优化版在处理几百上千条数据时,性能优势会很明显。
内容的提问来源于stack exchange,提问作者TripToBelize
相关产品推荐
相关产品推荐

