Você está trabalhando muito duro com os loops e condições. Isso deve fornecer uma matriz com cada elemento da interface como uma sub-matriz:
$raw = [IO.File]::ReadAllText("C:\Users\Public\Documents\Test\Config.txt")
$myArr = @()
$raw.Split("!") | % {$myArr += ,$_.Split("'n")}
Se tudo que você quer é cada seção de interface como um elemento de string, você pode mudar as últimas duas linhas para isso:
$myArr = $raw.Split("!")
Pode haver uma pequena limpeza para fazer com o array depois disso, mas isso deve levar você a 99% do caminho até lá. Por exemplo, para obter apenas os elementos entre interface Loopback0
e router bgp 65052
:
$i = 0
$myArr | % {
if ($_[0] -like "*interface Loopback0*") {
$start = $i
} elseif ($_[0] -like "*router bgp 65052*") {
$end = $i
}
$i++
}
$myArr | Select-Object -Skip $start -First ($end-$start)