介绍
目的:LISTENING state on localhost
使用 PowerShell 函数检查端口是否处于
以下命令:
New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
结果是:
PS C:\Windows\system32> New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
At line:1 char:33
+ New-Object Net.Sockets.TcpClient.Connect("127.0.0.1",10389)
+ ~
Unexpected token ')' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
PS C:\Windows\system32>
问题
哪个 PowerShell 函数可用于检查本地主机上的某个端口是否处于监听状态?
答案1
如果你在 Windows 8/Server 2012 或更高版本上使用 PowerShell v3.0+,那么你无需尝试连接到端口来确定状态,只需使用Get-NetTCPConnection
:
Get-NetTCPConnection -State Listen
对我来说,这更准确,因为它读取的是计算机上端口的状态。如果防火墙或类似的东西挡住了路,使用连接进行测试可能会让它看起来好像没有“侦听”,但实际上它确实在侦听。
答案2
首先创建并存储连接:
$connection = (New-Object Net.Sockets.TcpClient)
$connection.Connect("127.0.0.1",10389)
然后检查是否已连接
if ($connection.Connected) {
"We're connected"
}
或者按照 Colyn1337 的建议
Try {
$connection = (New-Object Net.Sockets.TcpClient)
$connection.Connect("127.0.0.1",10389)
"Connected"
}
Catch {
"Can't Connect"
}
答案3
我曾尝试将此添加到技术人员的答案中,因此这是对他的答案的扩展。您可以像这样微调输出:
Get-NetTCPConnection -State Listen | Where-Object {$_.LocalAddress -eq "192.168.56.1" -and $_.LocalPort -eq "139"}
如果它正在监听该端口,它将返回一个数据数组。如果没有监听器,它将返回 null,因此不需要错误处理。
答案4
如果您正在检查端口号是否被占用,则正常情况是 -eq “$null” 不起作用:
例如如果你运行以下命令
$PortNumberOutPut = Get-NetTCPConnection | where Localport -eq $portNumber
您想检查变量是否为空
if (!$PortNumberOutPut) { Write-Host "variable is null" }
如果你想检查 $PortNumberOutPut 是否有除 $null 之外的任何值
if ($PortNumberOutPut) { Write-Host "variable is NOT null" }