Domanda

Il tentativo di creare uno script che invierà un 'run sh | b interfacciarsi' a uno switch Cisco. Scrivere l'output in un array. Dividere tale matrice con un vbCr quindi ogni linea della configurazione è in un'elemant SEP matrice.

Ho cercato di pelle il gatto molti modi e ancora sto lottando.

Logic in inglese: Invia l'ordine al dispositivo Cisco Catturare l'output di un array definire linee previste 'Questo sono linee che sono richieste sotto ogni 'interfaccia' dell'interruttore Abbinare il nome di 'interfaccia' e il numero corrispondente e scrivere in un file. Controllare sotto tale interfaccia per le linee specifiche nel previsto Se lo trova, scrivere la linea & "SI" Se non lo trova, scrivere la linea & "NO" Continuare a fare questo fino a quando non si trova più '^ interfaccia \ s [FG] [a-z]. +'

Output dovrebbe essere simile a questo: Interfaccia GigabitEthernet 0/2 spanning-tree portfast, YES

Questo è il codice di esempio che sta fallendo:

'These are the expected line (not being compared in the script below but is my intention to have it compare the matched elements)
Dim vExpectedINT(4)
vExpectedINT(0)  = "spanning-tree portfast"
vExpectedINT(1)  = "switchport access vlan 17"
vExpectedINT(2)  = "switchport mode access"
vExpectedINT(3)  = "ip mtu 1400"    


'objStream.Write "######################################################### " & vbcrlf
'objStream.Write "#                  I N T E R F A C E                    # " & vbcrlf
'objStream.Write "######################################################### " & vbcrlf


nCount = 0
vConfigLines = Split(strResultsINT, vbcr)

Set re = new RegExp
re.Global = False
re.IgnoreCase = True
re.Multiline = False
re.Pattern = "^interface [FG]"

' Regex Ex Definition
Set re2 = new RegExp
re2.Global = False
re2.IgnoreCase = True
re2.Multiline = False
re2.Pattern = "\sspanning-tree\sportfast"

' Regex Ex Definition
Set re3 = new RegExp
re3.Global = False
re3.IgnoreCase = True
re3.Multiline = False
re3.Pattern = "ip\smtu\s1400"

Set re4 = new RegExp
re4.Global = False
re4.IgnoreCase = True
re4.Multiline = False
re4.Pattern = "!"

' Compares the information
x = 1
Do While x <= Ubound(vConfigLines) - 1 do 
    MsgBox chr(34) & strLine & chr(34)
    If re.Test(vConfigLines(x)) Then
        ' Write data to not expected section
        x=x+1
        do
            If ! re4.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
                'objStream.Write vConfigLines(x) & vbcr
                elseif re2.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
                elseif re3.Test(vConfigLines(x)) Then
                MsgBox vConfigLines(x)
            else
                exit do
            end if
            x=x+1
        loop
        end IF
   End If
Loop    

Questo è un esempio di output vConfigLines:

Ci potrebbe essere 48+ porta per switch.

interface FastEthernet1/0/1
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast
!
interface FastEthernet1/0/2
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast
!
interface FastEthernet1/0/3
 switchport access vlan 127
 switchport mode access
 switchport voice vlan 210
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape 0 3 0 0
 priority-queue out 
 mls qos trust cos
 auto qos voip trust 
 spanning-tree portfast
È stato utile?

Soluzione

Quando di fronte a un compito difficile e complesso, basta seguire queste regole:

Divide the task in independently solvable subproblems
  getting the info from Cisco
  processing the resulting file
    gather interesting info
    output

Concentrate on the difficult subtask(s)
  processing the resulting file

Solve a simplified but generalized version of (each) subtask using handmade data
for easy testing
  You have items and are interested in whether they (don't) have given properties

I dati con cui giocare:

Item 0 (both props)
 prop_a
 prop_b
!
Item 1 (just b)
 prop_b
!
Item 2 (a only)
 prop_a
!
Item 3 (none)
!
Item 4 (irrelevant prop)
 prop_c
!
Item 5 (Richy)
 prop_c
 prop_b
 prop_a
!
Item 6 (Junky)
 junk

 prop_b
 whatever

!
#Item 7 (Nasty)
# prop_a_like_but_not_prop_a
# prop_b
#!

Keep it simple
  don't do more than absolutely necessary
  don't use variables/components you can do without

Quindi cominciamo:

Hai a che fare con un file di testo (linee). Quindi non fare più di

  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\TheProblem.txt")
  Dim sLine
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
      End If
  Loop
  tsIn.Close

90% del codice utilizzando Spalato .ReadAll è solo grasso. Sì, è Do Until tsIn.AtEndOfStream e non Do While tsIn.AtEndOfStream = False. No Set tsIn = Nothing, per favore.

I dati sono organizzati in blocchi (oggetto n ...!), Quindi assicuratevi di riconoscere le parti e sapere cosa fare quando trovarli:

  Dim tsIn : Set tsIn = goFS.OpenTextFile("..\data\TheProblem.txt")
  Dim sItem  : sItem    = "Item"
  Dim sEnd   : sEnd     = "!"
  Dim sLine
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             WScript.Echo "Begin, note item (name)"
           Case 1 = Instr(sLine, sEnd)
             WScript.Echo "End, output info"
             WScript.Echo "----------"
           Case Else
             WScript.Echo "Middle, gather info"
         End Select
      End If
  Loop
  tsIn.Close

uscita:

Begin, note item (name)
Middle, gather info
Middle, gather info
End, output info
----------
Begin, note item (name)
Middle, gather info
End, output info
----------
...

Per ogni voce l'uscita dovrebbe essere:

name, property, yes|no

Il modo più semplice per farlo è

WScript.Echo Join(aData, ", ")

Unire battiti concatenazione, soprattutto se si desidera impostare / manipolare il parti indipendentemente e / o pre-configurare alcuni di loro all'inizio.

  Dim aData  : aData    = Array( _
      Array( "Item?", "prop_a", "NO") _
    , Array( "Item?", "prop_b", "NO") _
  )
  Dim sLine, aTmp, nIdx
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             aTmp = aData
             For nIdx = 0 To UBound(aTmp)
                 aTmp(nIdx)(0) = sLine
             Next
           Case 1 = Instr(sLine, sEnd)
             For nIdx = 0 To UBound(aTmp)
                 WScript.Echo Join(aTmp(nIdx), ", ")
             Next
             WScript.Echo "----------"
           Case Else
             WScript.Echo "Middle, gather info"
         End Select
      End If
  Loop
  tsIn.Close

L'uscita

...
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
...

mostra che impostando default sensibili (NO), questa versione dello script offerte correttamente con oggetti aventi nessuna delle proprietà interessanti.

Quindi, consente di affrontare il mezzo / Caso parte Else:

   Case Else
     For nIdx = 0 To UBound(aTmp)
         If 1 = Instr(sLine, aTmp(nIdx)(1)) Then
            aTmp(nIdx)(2) = "YES"
            Exit For
         End If
     Next

uscita ora:

Item 0 (both props), prop_a, YES
Item 0 (both props), prop_b, YES
----------
Item 1 (just b), prop_a, NO
Item 1 (just b), prop_b, YES
----------
Item 2 (a only), prop_a, YES
Item 2 (a only), prop_b, NO
----------
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
----------
Item 4 (irrelevant prop), prop_a, NO
Item 4 (irrelevant prop), prop_b, NO
----------
Item 5 (Richy), prop_a, YES
Item 5 (Richy), prop_b, YES
----------
Item 6 (Junky), prop_a, NO
Item 6 (Junky), prop_b, YES
----------

Ma che dire di Nasty:

#Item 7 (Nasty)
# prop_a_like_but_not_prop_a
# prop_b
#!

La semplice Instr () avrà esito negativo, se un nome di proprietà è un prefisso di un altro. Per dimostrare che semplice iniziare e di aggiungere complessità tardi è buona strategia:

  Dim sFSpec : sFSpec   = "..\data\TheProblem.txt"
  WScript.Echo goFS.OpenTextFile(sFSpec).ReadAll
  Dim tsIn   : Set tsIn = goFS.OpenTextFile(sFSpec)
  Dim sItem  : sItem    = "Item"
  Dim sEnd   : sEnd     = "!"
  Dim aData  : aData    = Array( _
      Array( "Item?", "prop_a", "NO") _
    , Array( "Item?", "prop_b", "NO") _
  )
  Dim aRe    : aRe      = Array(New RegExp, New RegExp)
  Dim nIdx
  For nIdx = 0 To UBound(aRe)
      aRe(nIdx).Pattern = "^" & aData(nIdx)(1) & "$"
  Next
  Dim sLine, aTmp
  Do Until tsIn.AtEndOfStream
      sLine = Trim(tsIn.ReadLine())
      If "" <> sLine Then
         Select Case True
           Case 1 = Instr(sLine, sItem)
             aTmp = aData
             For nIdx = 0 To UBound(aTmp)
                 aTmp(nIdx)(0) = sLine
             Next
           Case 1 = Instr(sLine, sEnd)
             For nIdx = 0 To UBound(aTmp)
                 WScript.Echo Join(aTmp(nIdx), ", ")
             Next
             WScript.Echo "----------"
           Case Else
             For nIdx = 0 To UBound(aTmp)
                 If aRe(nIdx).Test(sLine) Then
                    aTmp(nIdx)(2) = "YES"
                    Exit For
                 End If
             Next
         End Select
      End If
  Loop
  tsIn.Close

uscita:

Item 0 (both props)
 prop_a
 prop_b
!
Item 1 (just b)
 prop_b
!
Item 2 (a only)
 prop_a
!
Item 3 (none)
!
Item 4 (irrelevant prop)
 prop_c
!
Item 5 (Richy)
 prop_c
 prop_b
 prop_a
!
Item 6 (Junky)
 junk

 prop_b
 whatever

!
Item 7 (Nasty)
 prop_a_like_but_not_prop_a
 prop_b
!

Item 0 (both props), prop_a, YES
Item 0 (both props), prop_b, YES
----------
Item 1 (just b), prop_a, NO
Item 1 (just b), prop_b, YES
----------
Item 2 (a only), prop_a, YES
Item 2 (a only), prop_b, NO
----------
Item 3 (none), prop_a, NO
Item 3 (none), prop_b, NO
----------
Item 4 (irrelevant prop), prop_a, NO
Item 4 (irrelevant prop), prop_b, NO
----------
Item 5 (Richy), prop_a, YES
Item 5 (Richy), prop_b, YES
----------
Item 6 (Junky), prop_a, NO
Item 6 (Junky), prop_b, YES
----------
Item 7 (Nasty), prop_a, NO
Item 7 (Nasty), prop_b, YES
----------
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top