【发布时间】:2021-07-19 09:24:57
【问题描述】:
所以我想得到一个powershell命令来列出防火墙规则和端口,我基本上必须使用2个命令:Get-NetFirewallRule和Get-NetFirewallPortFilter。
所以我基本上想出了这个:
Get-NetFirewallPortFilter | where-object {$_.LocalPort -cmatch '[0-9]+'}|select-object -Property @{n='Name';e={($_ | Get-NetFirewallRule).Name}}, @{n='Description';e={($_ | Get-NetFirewallRule).description}}, Protocol, LocalPort, RemotePort, @{n='Direction';e={($_|Get-NetFirewallRule).Direction}}
我首先选择了Get-NetFirewallPortFilter,因为我只想获得数字端口(因此我不想获得“任何”)。
问题是,我拥有的计算属性越多,运行速度就越慢。它每秒生成 3 行,IMO 非常慢。
我对命令进行了计时以查看需要多长时间(Out-GridView 也看到了输出,我认为它不会增加太多时间,它似乎每秒生成的行数一样多) :
PS C:\> measure-command { Get-NetFirewallPortFilter | where-object {$_.LocalPort -cmatch '[0-9]+'}|select-object -Property @{n='Name';e={($_ | Get-NetFirewallRule).Name}}, @{n='Description';e={($_ | Get-NetFirewallRule).description}}, Protocol, LocalPort, RemotePort, @{n='Direction';e={($_|Get-NetFirewallRule).Direction}} |out-gridview }
Days : 0
Hours : 0
Minutes : 1
Seconds : 59
Milliseconds : 143
Ticks : 1191434968
TotalDays : 0.00137897565740741
TotalHours : 0.0330954157777778
TotalMinutes : 1.98572494666667
TotalSeconds : 119.1434968
TotalMilliseconds : 119143.4968
它在约 119 秒内输出 358 行。
我可以运行任何优化以使其运行更快吗?
【问题讨论】:
-
为什么要在一行中按所有内容?
Get-NetFirewallRule显然是一个昂贵的 cmdlet。因此,将结果保存在变量 ($FirewallRule = $_ |Get-NetFirewallRule) 中并(重新)在计算表达式中使用该变量。 -
@iRon 但是我该怎么做呢?如果我声明一个变量然后像什么都没发生一样继续前进,它不会破坏管道吗?我的意思是,我不知道如何在命令行上构造它,我在哪里声明变量?我在哪里使用命令分隔符
;?