Мне нужно отфильтровать содержимое переменной, чтобы исключить все строки с совпадающими строками из файла SubnetExceptions.txt
в качестве фильтра, как и команду grep -v
.
Переменная _3 претерпела множество обработок, чтобы добиться нужного мне формата.
Рабочая часть кода выглядит следующим образом:
$Value=netsh dhcp server show mibinfo | findstr "Subnet Addresses"
$Value=$Value -replace "Subnet","% `n Subnet"
$Value=$Value -replace "No. of Addresses in use","AddressesInUse"
$Value=$Value -replace "No. of free Addresses","AddressesFree"
$Value=$Value -replace '^.|.$', ' '
$Value=$Value -replace ' ', ""
$Value=$Value -replace ' ', " "
$Value= -join $Value
$Value=$Value -replace '\n', ''
$Value=$Value -replace "% ", "`n"
$Value=$Value -replace ' = ', '='
Эти первые 11 строк ps1 обрабатывают вывод ($Value
) этой команды из этого:
Subnet = 10.1.8.0. No. of Addresses in use = 11. No. of free Addresses = 18. Subnet = 10.1.9.0. No. of Addresses in use = 1. No. of free Addresses = 201. Subnet = 10.1.11.0. No. of Addresses in use = 188. No. of free Addresses = 61. Subnet = 10.1.12.0. No. of Addresses in use = 207. No. of free Addresses = 44. Subnet = 10.1.13.0. No. of Addresses in use = 149. No. of free Addresses = 100.
к этому:
Subnet=10.1.8.0 AddressesInUse=11 AddressesFree=18 Subnet=10.1.9.0 AddressesInUse=1 AddressesFree=201 Subnet=10.1.11.0 AddressesInUse=188 AddressesFree=61 Subnet=10.1.12.0 AddressesInUse=207 AddressesFree=44 Subnet=10.1.13.0 AddressesInUse=149 AddressesFree=100
Эти строки замены работают с разрывами строк, точками, пробелами и форматированием «переменная = значение». Мне нужно, чтобы значения подсети находились в одной строке, чтобы я мог их отфильтровать, следовательно, обработка строк.
Фактический вывод команды состоит из 278 строк с таким же количеством строк, поэтому я обрезал его до 5 строк, чтобы он был минимальным, чтобы его можно было воспроизвести в лаборатории.
Содержимое файла фильтра (C:\Scripts\SubnetExceptions.txt) выглядит следующим образом:
10.1.12.0 10.1.13.0
Это последние два значения подсети, которые я хочу отфильтровать. Это то, что было протестировано до сих пор (добавив его прямо под лечением выше):
$Filter = (Get-Content '.\SubnetExceptions.txt' |
ForEach-Object {[regex]::Escape($_)}) -join '|'
($Value) -notmatch $Filter | Set-Content '.\output.txt'
Ожидаемый результат должен быть:
Subnet=10.1.8.0 AddressesInUse=11 AddressesFree=18 Subnet=10.1.9.0 AddressesInUse=1 AddressesFree=201 Subnet=10.1.11.0 AddressesInUse=188 AddressesFree=61
Где последние 2 строки были бы удалены из-за фильтра, но вместо этого в выходной файл пишется только значение "false".