使用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
相关产品推荐
相关产品推荐

