0

'shrun|を送信するスクリプトを作成しようとしています。bCiscoスイッチへのインターフェイス。出力を配列に書き込みます。そのアレイをvbcrで分割して、構成の各行がアレイの個別の要素になるようにします。

私は猫の皮をむく方法をたくさん試しましたが、それでも苦労しています。

英語のロジック:コマンドをCiscoデバイスに送信します。出力をアレイにキャプチャします。予想される行を定義します。'これは、スイッチの'インターフェイス'ごとに必要な行です。'インターフェイス'の名前と対応する番号を一致させて、ファイルに書き込みます。そのインターフェースの下で、予想される特定の行を確認します。見つかった場合は、行& "、YES"を書き込みます。見つからない場合は、行& "、NO"を書き込みます。これ以上見つからなくなるまでこれを続けます。 ^ interface \ s[FG][az]。+ '

出力は次のようになります。インターフェイスGigabitEthernet0/2スパニングツリーポートファスト、はい

これは失敗しているサンプルコードです:

'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    

これは、vConfigLines出力のサンプルです。

スイッチごとに48以上のポートが存在する可能性があります。

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
4

1 に答える 1

1

困難で複雑なタスクに直面するときは、次のルールに従ってください。

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

遊ぶデータ:

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

それでは始めましょう:

テキストファイル(行)を処理する必要があります。だから、以上のことをしないでください

  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

.ReadAllでSplitを使用するコードの90%は、非常に重要です。はい、そうではDo Until tsIn.AtEndOfStreamありませんDo While tsIn.AtEndOfStream = False。いいえSet tsIn = Nothing、お願いします。

データはブロック(アイテムn ...!)で編成されているため、パーツを認識し、それらを見つけるときに何をすべきかを知っていることを確認してください。

  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

出力:

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

各アイテムの出力は次のようになります。

name, property, yes|no

それを行う最も簡単な方法は

WScript.Echo Join(aData, ", ")

結合は連結を打ち負かします。特に、パーツを個別に設定/操作したり、最初にパーツの一部を事前設定したりする場合はそうです。

  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

出力

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

は、適切なデフォルト(NO)を設定することにより、このバージョンのスクリプトが、興味深いプロパティを持たないアイテムを正しく処理することを示しています。

それでは、真ん中/ケースエルスの部分に取り組みましょう:

   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

今すぐ出力:

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_like_but_not_prop_a
# prop_b
#!

あるプロパティ名が別のプロパティ名のプレフィックスである場合、単純なInstr()は失敗します。単純に開始し、後で複雑さを追加することが良い戦略であることを証明するには、次のようにします。

  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

出力:

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
----------
于 2012-01-11T09:50:04.703 に答える