Windows系統(tǒng)清理重復(fù)的防火墻規(guī)則腳本
Cleanup-FirewallDuplicates_CN.ps1
# 設(shè)置輸出編碼為 UTF-8,確保中文正常顯示
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
# 使用 netsh 獲取所有防火墻規(guī)則(比 Get-NetFirewallRule 快得多)
$output = (netsh advfirewall firewall show rule name=all verbose | Out-String).Trim() -split '\r?\n\s*\r?\n'
$propertyNames = [System.Collections.Generic.List[string]]::new()
# 定義中英文屬性名映射表(中文系統(tǒng)字段)
$propertyMap = @{
"名稱" = "RuleName"
"組" = "Group"
"配置文件" = "Profiles"
"已啟用" = "Enabled"
"操作" = "Action"
"替代" = "Override"
"程序" = "Program"
"本地地址" = "LocalIP"
"遠(yuǎn)程地址" = "RemoteIP"
"協(xié)議" = "Protocol"
"本地端口" = "LocalPort"
"遠(yuǎn)程端口" = "RemotePort"
"授權(quán)的用戶" = "AuthorizedUsers"
"授權(quán)的計算機(jī)" = "AuthorizedComputers"
"授權(quán)的本地主體" = "AuthorizedLocalPrincipals"
"本地用戶所有者" = "LocalUserOwner"
"應(yīng)用程序包" = "AppPackage"
"顯示名稱" = "DisplayName" # 備用名稱
}
$objects = @( $(foreach($section in $output ) {
$obj = @{}
foreach( $line in ($section -split '\r?\n') ) {
if( $line -match '^\-+$' ) { continue }
# 分割屬性名和值
$name, $value = $line -split ':\s*', 2
$name = $name.Trim()
# 映射為標(biāo)準(zhǔn)屬性名
$mappedName = $propertyMap[$name]
if (-not $mappedName) {
# 如果映射不存在,則清理原始名稱
$mappedName = $name -replace " ", ""
}
$obj.$mappedName = $value
if($propertyNames -notcontains $mappedName) {
$propertyNames.Add($mappedName)
}
}
$obj
}) | % {
foreach( $prop in $propertyNames ) {
if( $_.Keys -notcontains $prop ) {
$_.$prop = $null
}
}
[PSCustomObject]$_
})
# 按中文系統(tǒng)屬性分組
$r = $objects | Group-Object -Property RuleName, Program, Action, Profiles, RemoteIP, RemotePort, LocalIP, LocalPort, Enabled, Protocol
$r | ?{$_.Count -gt 1} | %{
# 獲取組內(nèi)的第一個規(guī)則對象
$firstRule = $_ | Select-Object -ExpandProperty group | Select-Object -First 1
# 優(yōu)先使用 DisplayName,其次使用 RuleName(中文系統(tǒng)可能使用"名稱")
if ($firstRule.PSObject.Properties.Name -contains "DisplayName") {
$name = $firstRule.DisplayName
} elseif ($firstRule.PSObject.Properties.Name -contains "RuleName") {
$name = $firstRule.RuleName
} else {
Write-Warning "無法獲取規(guī)則名稱,跳過此組規(guī)則"
return
}
Write-Host "處理重復(fù)規(guī)則組: $name" -ForegroundColor Cyan
try {
# 獲取所有同名規(guī)則并跳過第一個(保留)
$rulesToRemove = Get-NetFirewallRule -DisplayName $name | Select-Object -Skip 1
if ($rulesToRemove) {
Write-Host " 找到 $($rulesToRemove.Count) 個重復(fù)規(guī)則,正在刪除..." -ForegroundColor Yellow
$rulesToRemove | Remove-NetFirewallRule -Confirm:$false
Write-Host " 已成功刪除重復(fù)規(guī)則" -ForegroundColor Green
} else {
Write-Host " 沒有找到需要刪除的重復(fù)規(guī)則" -ForegroundColor Gray
}
} catch {
Write-Error "刪除規(guī)則時出錯: $_"
}
}
使用:打開Powershell,執(zhí)行:
cd .\Desktop\
powershell -ExecutionPolicy Bypass -File .\Cleanup-FirewallDuplicates_CN.ps1
作者:wanghongwei
版權(quán)聲明:本作品遵循<CC BY-NC-ND 4.0>版權(quán)協(xié)議,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請附上原文出處鏈接及本聲明。

浙公網(wǎng)安備 33010602011771號