首页 > 解决方案 > 检查 TCP 连接数

问题描述

我需要检查给定计算机上的连接数,如果它大于 100 - 杀死进程。我的代码:

IF ((Get-counter -Counter "\TCPv4\Connections Established" | Measure-Object).Length -gt 100)
{
  stop-process -name Notepad
  Write-host Process killed!
}
Else {
  Write-host OK!
}

它不工作。如何将“已建立的连接”转换为字符串并使其工作?PowerShell 新手。谢谢。

我使用脚本:

IF ((Get-Counter -Counter "\TCPv4\Connections Established").CounterSamples.CookedValue -gt 100)
{
stop-process -name Notepad
Write-host Process killed!
}
Else {
Write-host not ok.
}

输出:

PS C:\Users\Administrator> D:\Share\scriptif.ps1
DEBUG:    1+  <<<< D:\Share\scriptif.ps1
DEBUG:     ! CALL function 'scriptif.ps1'  (defined in file 'D:\Share\scriptif.ps1')
DEBUG:    2+ IF <<<<  ((Get-counter -Counter "\TCPv4\Connections Established").CounterSamples.cookedvalue -gt 100)
DEBUG:    8+  <<<< Write-host not ok.
not ok.
DEBUG:    2+         $foundSuggestion = <<<<  $false
DEBUG:     ! SET $foundSuggestion = 'False'.
DEBUG:    4+         if <<<< ($lastError -and
DEBUG:   15+         $foundSuggestion <<<<

当我尝试时(在命令行中):

(Get-Counter -Counter "\TCPv4\Connections Established").CounterSamples.CookedValue

我有空的结果。

我尝试了新的调试方法,但没有效果:

PS C:\Users\Administrator> (Get-Counter -Counter "\TCPv4\Connections Established").CounterSamples.CookedValue
DEBUG:    1+ (Get-Counter -Counter "\TCPv4\Connections Established").CounterSamples. <<<< CookedValue
DEBUG:    2+         $foundSuggestion = <<<<  $false
DEBUG:     ! SET $foundSuggestion = 'False'.
DEBUG:    4+         if <<<< ($lastError -and
DEBUG:   15+         $foundSuggestion <<<<

标签: powershell

解决方案


一步一步地检查你的输出,看看你在哪里可以找到你感兴趣的数字。让我们从检查什么Get-Counter给你开始:

PS> (Get-counter -Counter "\TCPv4\Connections Established")

Timestamp                 CounterSamples
---------                 --------------
2019-10-09 11:20:09       \\hostname\tcpv4\connections established :
                          190

您必须从CounterSamples属性中获取数据,所以让我们检查一下:

PS> (Get-counter -Counter "\TCPv4\Connections Established").countersamples

Path                                         InstanceName CookedValue
----                                         ------------ -----------
\\hostname\tcpv4\connections established                      159

如您所见,您要查找的是CookedValue属性,因此您可以将if语句更改为:

if ((Get-counter -Counter "\TCPv4\Connections Established").countersamples.cookedvalue -gt 100) {
  # do something
}

编辑:根据评论,这是启用调试的所需输出(评论开头#是我添加的):

# First I set debug
PS> Set-PSDebug -Trace 2

# Then I check CounterSamples
PS> (Get-counter -Counter "\TCPv4\Connections Established").countersamples
DEBUG:    1+  >>>> (Get-counter -Counter "\TCPv4\Connections Established").countersamples
DEBUG:     ! CALL function '<ScriptBlock>'

Path                                         InstanceName CookedValue
----                                         ------------ -----------
\\hostname\tcpv4\connections established                      186

# Then I check CookedValue
PS> (Get-counter -Counter "\TCPv4\Connections Established").countersamples.cookedvalue
DEBUG:    1+  >>>> (Get-counter -Counter "\TCPv4\Connections Established").countersamples.cookedvalue
DEBUG:     ! CALL function '<ScriptBlock>'
192

对于 PowerShell 2.0 兼容性,请使用以下Select-Object方式代替.CookedValue

(Get-counter -Counter "\TCPv4\Connections Established").countersamples | Select-Object -ExpandProperty CookedValue

推荐阅读