Как сделать выборку свойств сети из вывода netsh wlan show network mode=bssid

Как известно, в Windows есть команда netsh wlan show network mode=bssid, которая позволяет узнать такую полезную информацию о сетях в эфире вокруг вас, как: тип сети, инфраструктура, проверка подлинности, канал, уровень сигнала и т.п.
Но что, если нужно сделать выборку по какой-то конкретной сети и записать результаты файл, чтобы допустим потом можно было составить представление о том как менялся уровень сигнала, в течение дня?Я для себя написал решение, которое вы можете увидеть ниже, оно не совсем ровное, но мою задачу решает. Если логически его продолжить, то можно будет результат парсинга разобрать дальше для составления массива из которого можно будет построить графики, но я этим уже не занимался.
Итак:


[string]$file = ((netsh wlan show network  mode=bssid |  Select-Object ).Trim() |  Select-String "^SSID|Сигнал|BSSID|Канал" | Out-String)
$logfile2 = "$env:homedrive\bin\logs\LogAir-$("{0:dd-MM-yy}--{0:HH-mm}" -f (Get-Date)).txt"


function GetBSSIDInfo($firstString, $numbssid)
{    
    $pattern = "$firstString\r\n(.*\r\n){$numbssid}"
    $result = [regex]::Match($file,$pattern).Value
    return $result
}


GetBSSIDInfo("targetnetwork", 3)
$result | Out-File $logfile2 

Я делаю выборку по названию, маку, каналу и уровню сигнала.
Функции задаем название сети, которую парсим и количество строк по свойствам умножаемое на три. То есть, если у сети один BSSID, то переменной $numbssid присваем 3, если же BSSID’ов три, то $numbssid = 9
Работает как самостоятельный сценарий; если же запускать из Powershell ISE, то корректных значений не получим, поскольку тот режет результат netsh wlan show network mode=bssid | Select-Object ).Trim() | Select-String «^SSID|Сигнал|BSSID|Канал» | Out-String.
Собака порылась где-то здесь Select-String «^SSID|Сигнал|BSSID|Канал», обработка именно ее идет иначе в IDE и в скрипте o.O. В общем из раздела магии Misrosoft 🙂

Поэтому я еще немного посидел, подумал и заморочился с чистыми регулярками, получилось не очень красиво пока что, но зато работает корректнее и с меньшим количеством человековмешательств:



[string]$Air = ((netsh wlan show network  mode=bssid | Select-Object ).Trim() | Out-String) 
$TargetSSID = "Искомая сеть"
$filter1 = "$TargetSSID\r\n(.*\r\n)+?SSID"
$filterAir = [regex]::Match($Air,$filter1).Value

$filter2 = "(BSSID\s\d+):\s+(?:.+)\r\n(Сигнал|Signal):\s+(?:\d+)%\r\n.*\r\n(Канал|Channel):\s+(?:\d+)"
$filter3 = "(?:BSSID\s\d+):\s+(.+)\r\n(?:Сигнал|Signal):\s+(\d+)%\r\n.*\r\n(?:Канал|Channel):\s+(\d+)"

$nummatches = [regex]::Matches($filterAir,$filter2).Count

$logfile = "$env:homedrive\bin\logs\LogAir-$("{0:dd-MM-yy}--{0:HH-mm}" -f (Get-Date)).txt"

for ( $j = 0; $j -lt $nummatches; $j++ ) {
    $hkeys = [regex]::Matches($filterAir,$filter2)[$j].Groups[1].Value
    $hvalues = [regex]::Matches($filterAir,$filter3)[$j].Groups[1].Value
    Write-host ($hkeys, $hvalues)    
    Out-File -FilePath $logfile -InputObject "$hkeys `t $hvalues" -Append -encoding unicode

    $hkeys = [regex]::Matches($filterAir,$filter2)[$j].Groups[2].Value
    $hvalues = [regex]::Matches($filterAir,$filter3)[$j].Groups[2].Value
    Write-host ($hkeys, $hvalues)    
    Out-File -FilePath $logfile -InputObject "$hkeys `t $hvalues" -Append -encoding unicode

    $hkeys = [regex]::Matches($filterAir,$filter2)[$j].Groups[3].Value
    $hvalues = [regex]::Matches($filterAir,$filter3)[$j].Groups[3].Value
    Write-host ($hkeys, $hvalues)    
    Out-File -FilePath $logfile -InputObject "$hkeys `t $hvalues" -Append -encoding unicode
}

`t — используется для разделения и возможности обработки значений в Excel, csv по сути.