2012-01-10 3 views
0

「sh run |」を送信するスクリプトを作成しようとしています。 bインターフェイスをCiscoスイッチに接続します。出力を配列に書き込みます。その配列をvbcrで分割し、configの各行が配列の別の要素に入るようにします。vbscriptシスコのスイッチインターフェイスを読み取る

私は多くの方法で猫の皮を剥がそうとしましたが、まだ私は苦労しています。英語で

ロジック: 予想ラインインタフェースのスイッチ マッチの「インタフェースの名前と対応する番号を「これは、それぞれの下で必要とされているラインである 'を定義配列 に出力をキャプチャCiscoデバイスへ をコマンドを送信しますそれをファイルに書き出します。予想 内の特定の行のために、そのインタフェースの下 チェック、それはそれを見つけた場合、それが見つからない場合は、「YES」 を行&を書くライン&を書く「NO」 そうしないまでこれをやっておいてください'[AZ] ^インターフェース\ S [FG] +' すべての詳細を見つける

出力は次のようになります。 インターフェイスのGigabitEthernet 0/2 スパニングツリーPortFast、YES

をこのサンプルコードでありますは失敗しています:

'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 

答えて

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 

スプリットを使用してコードの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 
---------- 
関連する問題