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

使用PowerShell对比文本文件时的多余服务误写入问题

服务配置文件冗余清理代码修改方案

文件内容对比

File 1(新文件,当前系统实际服务列表)

Windows Remote Management (WS-Management),OS,WARNING
Windows Push Notifications System Service,OS,WARNING
#Background Intelligent Transfer Service,OS,WARNING
VMware Tools,OS,WARNING
#Windows Modules Installer,OS,WARNING

File 2(旧文件,包含冗余服务)

Windows Remote Management (WS-Management),OS,WARNING
Windows Push Notifications System Service,OS,WARNING
#Background Intelligent Transfer Service,OS,WARNING
VMware Tools,OS,WARNING
VMware Tools1,OS,WARNING
VMware Tools2,OS,WARNING
VMware Tools3,OS,WARNING
VMware Tools4,OS,WARNING
#Windows Modules Installer,OS,WARNING

问题

对比两个文件可知,File2中存在VMware Tools1至VMware Tools4这类系统已不再有的冗余服务,但当前代码执行后会将这些冗余服务保留并写入新的Services_Mon.txt文件,需要修改代码实现仅保留File1中存在的服务条目,剔除冗余内容。

原代码

$svr = $env:COMPUTERNAME

$newarr=@()
$arrwithouthash=@()
$final_arr=@()

$Rename_File = Copy-Item -Path "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Destination "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon_$((Get-Date).ToString("ddMMyyyy")).txt" -Force

$srvName = "K53CMA"
$servicePrior = Get-Service $srvName -ComputerName $svr

Stop-Service -Name $srvName -Force
sleep -Seconds 10
Start-Service -Name $srvName
sleep -Seconds 10
$serviceAfter = Get-Service $srvName

$file1 = gc "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon_$((Get-Date).ToString("ddMMyyyy")).txt"
$file2 = Get-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" | ForEach-Object {
    if ($file1.Contains("#$_")) { "#$_" }
    else { $_ }
}

Clear-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Force
$file2 | Set-Content -Path "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Force

修改方案

原代码仅处理了注释标记(#)的同步,未过滤File2中不存在于File1的冗余条目。需修改$file2的生成逻辑,改为仅保留File1中存在的条目,同时保留原有的注释状态:

关键修改代码段

$file1 = Get-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon_$((Get-Date).ToString("ddMMyyyy")).txt"
# 生成File1条目的两种形式集合(带#和不带#),用于匹配
$file1Entries = $file1 | ForEach-Object {
    $_
    if ($_ -match '^#(.*)') { $matches[1] }
    else { "#$_" }
} | Select-Object -Unique

# 仅保留File2中存在于File1的条目,并同步注释状态
$file2 = Get-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" | ForEach-Object {
    $current = $_
    # 检查当前条目是否直接在File1中存在
    if ($file1Entries -contains $current) {
        $current
    }
    else {
        $unhashed = $current -replace '^#', ''
        $hashed = "#$unhashed"
        # 检查注释/非注释版本是否在File1中存在
        if ($file1Entries -contains $hashed) {
            $hashed
        }
        else {
            # 冗余条目直接跳过
            $null
        }
    }
} | Where-Object { $_ -ne $null } # 过滤空值(冗余条目)

完整修改后代码

$svr = $env:COMPUTERNAME

$newarr=@()
$arrwithouthash=@()
$final_arr=@()

$Rename_File = Copy-Item -Path "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Destination "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon_$((Get-Date).ToString("ddMMyyyy")).txt" -Force

$srvName = "K53CMA"
$servicePrior = Get-Service $srvName -ComputerName $svr

Stop-Service -Name $srvName -Force
sleep -Seconds 10
Start-Service -Name $srvName
sleep -Seconds 10
$serviceAfter = Get-Service $srvName

$file1 = Get-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon_$((Get-Date).ToString("ddMMyyyy")).txt"
# 生成File1条目的两种形式集合(带#和不带#)
$file1Entries = $file1 | ForEach-Object {
    $_
    if ($_ -match '^#(.*)') { $matches[1] }
    else { "#$_" }
} | Select-Object -Unique

# 仅保留File2中存在于File1的条目,并同步注释状态
$file2 = Get-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" | ForEach-Object {
    $current = $_
    # 检查当前条目是否直接在File1中存在
    if ($file1Entries -contains $current) {
        $current
    }
    else {
        $unhashed = $current -replace '^#', ''
        $hashed = "#$unhashed"
        # 检查注释/非注释版本是否在File1中存在
        if ($file1Entries -contains $hashed) {
            $hashed
        }
        else {
            # 冗余条目直接跳过
            $null
        }
    }
} | Where-Object { $_ -ne $null } # 过滤空值(冗余条目)

Clear-Content "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Force
$file2 | Set-Content -Path "\$svr\c$\Tivoli_Configs\Monitor_Services\Services_Mon.txt" -Force

修改说明

  • 新增$file1Entries集合,包含File1所有条目的注释/非注释两种状态,确保匹配时不会遗漏注释同步
  • 遍历File2时,先检查当前条目是否存在于File1;若不存在,再检查其注释/非注释版本是否存在;均不存在则判定为冗余条目并跳过
  • 通过Where-Object过滤空值,确保冗余条目不会写入目标文件

内容的提问来源于stack exchange,提问作者Empty Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:01:10