Powershell 获取NetFirewallRule的速度非常慢

Powershell 获取NetFirewallRule的速度非常慢,powershell,Powershell,Get-NetFirewallRule方法检查状态约半秒。这是一个很长的时间,当我需要检查超过一百个名字在防火墙 # About a minute checked this 0..100 | % { Get-NetFirewallRule -DisplayName $_ } 我可以加快这个方法吗?谢谢首先获取所有规则会更快。然后根据您的条件查询检索到的规则 # Storing Rules in Variable First $rules = Get-NetFirewallRule $rule

Get-NetFirewallRule
方法检查状态约半秒。这是一个很长的时间,当我需要检查超过一百个名字在防火墙

# About a minute checked this

0..100 | % { Get-NetFirewallRule -DisplayName $_ }

我可以加快这个方法吗?谢谢

首先获取所有规则会更快。然后根据您的条件查询检索到的规则

# Storing Rules in Variable First
$rules = Get-NetFirewallRule
$rules | Where DisplayName -in 0..100

# Using the pipeline only 
Get-NetFirewallRule | Where DisplayName -in 0..100
性能测试:

# One Rule At a Time
Measure-Command {0..10 |% { get-netfirewallrule -displayname $_ }}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 9
Milliseconds      : 877
Ticks             : 98770423
TotalDays         : 0.000114317619212963
TotalHours        : 0.00274362286111111
TotalMinutes      : 0.164617371666667
TotalSeconds      : 9.8770423
TotalMilliseconds : 9877.0423

# Get All Rules First
Measure-Command {$rules = Get-netfirewallrule; $rules | where displayname -in 0..10}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 44
Ticks             : 10440671
TotalDays         : 1.20841099537037E-05
TotalHours        : 0.000290018638888889
TotalMinutes      : 0.0174011183333333
TotalSeconds      : 1.0440671
TotalMilliseconds : 1044.0671

试着把它放到工作中,它会更快:

$job = Start-Job -ScriptBlock {
  0..100 | % { Get-NetFirewallRule -DisplayName $_ }
}
$job | Wait-Job | Receive-Job

嗯,我猜它不是按名称或显示名称索引的?这是它使用的wmi类。我不确定是否值得深入研究,但仅供参考

Get-WmiObject MSFT_NetFirewallRule -Namespace Root\StandardCimv2 -filter 'creationclassname="MSFT|FW|FirewallRule|vm-monitoring-dcom"'
顺便说一句,防火墙规则存储在注册表中

有多种get-netfirewall*filter命令,可使访问某些信息更快,但不能访问name或displayname


您可以尝试创建自己的显示名称哈希表。

使用
$rules=Get NetFirewallRule
检索所有规则一次,然后在脚本本身中按名称筛选?