PowerShell筛选CSV:提取指定组中始终失败的客户端记录
解决PowerShell筛选备份报告中跨组失败记录的问题
你的问题出在原脚本的逻辑上:Group-Object后用$_.Count -eq 1会过滤掉同一【客户端+备份集+组】组合下多次失败的记录,同时也没正确区分"同一备份集在其他组成功但当前组失败"的场景——我们需要的是针对每个【Client Name + Save Set Name + Group】的组合,只要该组合下没有成功记录(全是失败),就保留这个组合的失败记录,不管其他组的状态如何。
正确的PowerShell脚本
# 读取原始CSV并处理 $rawData = Get-Content E:\Report\Daily_Failed.csv | ConvertFrom-Csv # 按客户端、备份集、组分组,筛选出组内无成功记录的分组 $filteredGroups = $rawData | Group-Object -Property 'Client Name','Save Set Name','Group' | Where-Object { # 检查当前分组中是否不存在Status为Success的记录(兼容原始数据中Success前的空格) -not ($_.Group.Status -match 'Success') } # 展开分组并导出结果 $filteredGroups | Select-Object -Expand Group | Select-Object "Client Name", "Save Set Name", "status", "Group" | Export-Csv -NoTypeInformation E:\Report\Final_Failed.csv
逻辑解释
- 精准分组:按
Client Name、Save Set Name、Group三个字段分组,确保我们处理的是同一个客户端在同一个组下的同一个备份集的所有记录,完全隔离其他组的同备份集数据。 - 状态校验:用
-not ($_.Group.Status -match 'Success')检查分组内是否没有成功记录——只要该组合下全是失败,就保留,哪怕同一备份集在其他组有成功记录也不影响当前组的筛选。 - 兼容数据瑕疵:你的原始CSV里
Success前有多余空格(比如Success),用-match 'Success'可以忽略前后空格,精准匹配状态值。
验证结果
用你提供的原始输入测试,这个脚本会输出你期望的结果:
SQL01.abc.com,MSSQL,D_CWT_SQL_FULL,Failed
SQL01.abc.com,MSSQL:model,D_CWT_SQL_FULL,Failed
SQL01.abc.com,MSSQL:msdb,D_CWT_SQL_FULL,Failed
SQL01.abc.com,MSSQL:master,SQL_T-Log_15Mins,Failed
5001.abc.com,H:\System,CWT_FS,Failed
如果你的原始数据里有同一【客户端+备份集+组】的多条重复失败记录,可以在Select-Object -Expand Group后追加| Select-Object -Unique *来去除重复项。
内容的提问来源于stack exchange,提问作者GURU SINGH
相关产品推荐
相关产品推荐

