だから私はarrayを持っており、それを1行ずつ検索し、インターフェイスで分割する必要があります。私のコードはこのファイルを1行ずつループします。 「!」でインターフェースを分割したい文字を入力し、文字列を配列の要素に追加して、さらに解析できるようにします。
ファイルの内容は次のようになります。
!
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
構成アーカイブファイルコードを検索する
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"
}`
質問:「!」の間にすべてのインターフェイス文字列を追加するにはどうすればよいですか。配列内の1つの要素に、次のすべての要素を2番目の要素に、というように続けますか?
更新されたコード
$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)
あなたはループと条件であまりにも一生懸命働いています。これにより、各インターフェイス要素をサブ配列として持つ配列が取得されます。
$raw = [IO.File]::ReadAllText("C:\Users\Public\Documents\Test\Config.txt")
$myArr = @()
$raw.Split("!") | % {$myArr += ,$_.Split("`n")}
文字列要素としての各インターフェイスセクションだけが必要な場合は、最後の2行を次のように変更できます。
$myArr = $raw.Split("!")
その後、アレイを少しクリーンアップする必要があるかもしれませんが、これで99%の道のりが得られるはずです。たとえば、interface Loopback0
と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)
ブロックに最初に分割
$x = Get-Content -Path 'D:\powershell\Files\input.txt'
$x2 = $x -join "`r`n"
$x3 = $x2 -split "!`r`n"
要するに:
$x = @( $(@( Get-Content -Path 'D:\powershell\Files\input.txt' ) -join "`r`n" ) -split "!`r`n" )
次に、カラー化された出力
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 )
}