You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell哈希表中为客户端主机存储唯一的备份计划条目

解决PowerShell哈希表中备份计划的去重问题

我来帮你搞定这个备份计划去重的需求~先明确下你的目标:从test1.txt的每行内容里,提取数字之后、incr或manual之前的名称,并且让每个客户端主机对应的备份计划只保留唯一值。

先看你提供的test1.txt内容:

bpdppa301p.corpads.local 86929680 JC_UNIX_FS01_INCR JC_FS UNIX_FS01_INCR incr 02/24/2022 03/30/2022 03/30/2022 disk 1645678800 backup 84 MB /dbwsrp01/dbwsrp01 JCBDD1300P.corpads.local
bpdppa302p.corpads.local 82578060 MN_DB_ORA manual 02/24/2022 04/21/2022 03/31/2022 disk 1645678854 80 MB RMAN:PFDPRE01_jf0mjj9l_1_1 MNBDD3302P.corpads.local
bpdppa301p.corpads.local 86929880 JC_UNIX_FS01_INCR JC_FS UNIX_FS01_INCR incr 02/24/2022 03/30/2022 03/30/2022 disk 1645678800 backup 84 MB /dbwsrp01/dbwsrp01 JCBDD1300P.corpads.local

你原来的代码已经能正确提取备份计划,但缺少去重逻辑。这里给你两种简单的修改方案,都能实现每个客户端对应唯一备份计划的效果:

方案一:添加时即时去重(推荐)

在更新哈希表的过程中,每次添加新计划都和已有计划合并后去重,避免哈希表存储冗余数据:

$backupLogLines = @(Get-Content C:\scripts\test1.txt) -match "incr|full|manual"
$planTable = @{}
foreach ($line in $backupLogLines) {
    $metadataParts = $line -csplit "incr|full|manual"
    $clientHostName,$null,$backupPlans = -split $metadataParts[0]
    
    if(-not $planTable.Contains($clientHostName)){
        # 首次添加客户端时,直接对当前计划去重
        $planTable[$clientHostName] = @($backupPlans) | Select-Object -Unique
    }
    else {
        # 合并已有计划与新计划,再去重后更新哈希表
        $planTable[$clientHostName] = ($planTable[$clientHostName] + $backupPlans) | Select-Object -Unique
    }
}

方案二:最后统一去重(适合小数据量场景)

如果你的日志行数不多,也可以先按原逻辑收集所有计划,最后遍历哈希表统一去重,逻辑更直观:

$backupLogLines = @(Get-Content C:\scripts\test1.txt) -match "incr|full|manual"
$planTable = @{}
foreach ($line in $backupLogLines) {
    $metadataParts = $line -csplit "incr|full|manual"
    $clientHostName,$null,$backupPlans = -split $metadataParts[0]
    
    if(-not $planTable.Contains($clientHostName)){
        $planTable[$clientHostName] = @($backupPlans)
    }
    else {
        $planTable[$clientHostName] += $backupPlans
    }
}

# 遍历哈希表,对每个客户端的计划统一去重
$planTable.Keys | ForEach-Object {
    $planTable[$_] = $planTable[$_] | Select-Object -Unique
}

用你的测试数据验证的话,处理后bpdppa301p.corpads.local对应的备份计划会是JC_UNIX_FS01_INCR和JC_FS,重复的条目会被自动过滤掉。

内容的提问来源于stack exchange,提问作者postmaster 420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:07:42