PowerShell - adiciona várias sequências ao mesmo elemento em uma matriz

4

Portanto, tenho uma matriz que preciso pesquisar linha por linha e dividir por interfaces. Meu código percorre este arquivo linha por linha. Eu quero dividir as interfaces pelo "!" caractere e adicione as strings a um elemento em uma matriz para que eu possa fazer uma análise mais detalhada.

Veja como é o conteúdo do arquivo.

!
interface Loopback0
 description MANAGEMENT
 ip address 172.xxx.xxx.x
!
interface FastEthernet0/0
 description m<1> A<LAN on chr-city>
 no ip address
 ip flow ingress
 duplex auto
 speed auto
!
interface FastEthernet0/0.50
 description Management
 encapsulation dot1Q 50 native
 ip address 172.xxx.xxx.x
!
interface FastEthernet0/0.51
 description Transit
 encapsulation dot1Q 51
 ip address 172.xxx.xxx.x
 service-policy input mark
!
interface FastEthernet0/1
 no ip address
 shutdown
 duplex auto
 speed auto
!
interface Serial0/0/0
 description m<1> WAN<> V<CL> 
 bandwidth 1536
 ip address 172.xxx.xxx.x
 ip flow ingress
 no ip mroute-cache
 service-module t1 timeslots 1-24
 no cdp enable
 service-policy output shape
!
router bgp 65052

pesquise o código do arquivo de configuração

for ($m=0; $m -lt $configFileContents.length; $m++) {
     $index = 0
         if($configFileContents[$m] -eq "interface Loopback0"){ #starting spot
                $a = @()
                While($configFileContents[$m] -notmatch "router bgp") { #ending spot              
                       if($configFileContents[$m] -ne "!") { #divide the elements
                            $a[$index] += $configFileContents[$m] 
                         $m++
                        } else {
                                $index++
                                $m++
                           }
                 }

                Write-Host "interface archive section" -BackgroundColor Green
               $a
                Write-Host "end of interface archive section"  
         }'

Pergunta: Como adiciono todas as strings de interface entre o "!" para um elemento na minha matriz e todos os próximos para o segundo elemento e assim por diante?

Código atualizado

        $raw = [IO.File]::ReadAllText("$recentConfigFile")
        $myArr = @()
        $raw.Split("!") | % {$myArr += ,$_.Split("'n")}


        $i = 0
        $myArr | % {
            if ($_[0].Trim() -eq "interface Loopback0") {
                $start = $i
                } elseif ($_[0].Trim() -eq "router bgp 65052") {
                $end = $i
                }
            $i++
            }

        $myArr | Select-Object -Skip $start -First ($end-$start)
    
por runcmd 23.06.2014 / 18:24

2 respostas

1

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)
    
por 23.06.2014 / 19:23
0

Primeira divisão em blocos

$x = Get-Content -Path 'D:\powershell\Files\input.txt' 
$x2 = $x -join "'r'n"
$x3 = $x2 -split "!'r'n"

em resumo:

$x = @( $(@( Get-Content -Path 'D:\powershell\Files\input.txt'  ) -join "'r'n" ) -split "!'r'n" )

Em seguida, imprima em cores

ForEach ($line in $x) {
    $local:lineArr = @( $line -split "'r'n" )
    $local:arrayInterfaces = @(  $local:lineArr | Where-Object {$_ -match '\s*interface\s'} )
    $local:arrayNonInterfaces = @( $local:lineArr | Where-Object { $local:arrayInterfaces -notcontains $_ } )

    Write-Host -ForegroundColor Red $( $local:arrayInterfaces -join "'r'n" )
    Write-Host -ForegroundColor Green $( $local:arrayNonInterfaces -join "'r'n" )
    Write-Host ( '#' * 60 )
}
    
por 23.06.2014 / 19:22