param( [string]$logfile = "$env:temp\bom_ephemeralportstat.log" ) $timeout = 60 $ret = cmd /c "chcp 437 > nul && netsh int ipv4 show dynamicport tcp" $startport = [int](($ret | Select-String 'Start Port').Line -replace '\D','') $numofports = [int](($ret | Select-String 'Number of Ports').Line -replace '\D','') $endport = $startport + $numofports - 1 #$usedports = Get-NetTCPConnection | Where-Object { $_.LocalPort -ge $startport -and $_.LocalPort -le $endport } $job = Start-Job { Get-NetTCPConnection | Select LocalPort,State } Wait-Job $job -TimeOut $timeout | Out-Null if ($job.State -eq "Completed") { $usedports = Receive-Job $job $usedports = $usedports| Where-Object { $_.LocalPort -ge $startport -and $_.LocalPort -le $endport } } else { return "Error: Command Timedout in $($timeout) sec." } $output = "Port Range : $($numofports)`n" $output += "Used total : $($usedports.Count)`n" $freeports = $numofports - $usedports.Count $output += "Free ports : $($freeports)`n" $output += "Count by coinnection status :`n" $states = $usedports | Group-Object -Property State |Select Name,Count foreach ($state in $states) { $output += "`t$($state.Name) : $($state.Count)`n" } $output | Out-File $logfile return ($numofports - $usedports.Count)