目录
需求
工作中,我们常会通过自动化
或手动
或自动记录log
等方式抓取设备的配置,但我们可能遇到设备抓取可能不全。
同时,基于自动化的抓取一般都会存放到excel工作表
中,以sheet表示不同的设备。
人工核对的工作量比较大,因此可以python编写脚本
判断或excel vbs
代码判断等方式。
由于我的环境不允许使用python,因此本文将分享一个vbs判断设备配置是否备份完整
的代码。
方法
思考判断方式
由于设备是Cisco和H3C混用,因此最后的返回值是不太一样的。
- Cisco
Cisco设备show running-config
后,最终的结果以end
结尾,而设备名以#
结尾(标准是在enable视图而非conf t视图进行show) - H3C
H3C设备display current-configuration
后,最终的结果以return
结尾,而设备名以<
开头和>
结尾。
不过我们只要根据最后一行输出结果,同时判断设备名是否输出出来,即可判断配置抓取是否完整。
- 脚本阅读到
end
或return
后,进行判断:end
,判断下一行是否以#
结尾;return
,判断下一行是否以<
开头和>
结尾;
- 根据判断,如果上一步的
1
和2
的返回值都是false,则返回false,否则就返回true
理清思路后,我们可以用各类AI进行代码生成,准确率很高(我就是这样做的)
代码
该代码会创建一个新的sheet,创建四列,第一列为
IP
、第二三列为return后存在设备名
,end后存在设备名
,第四列为最终判断该设备是否配置抓取完整
vba
Sub CheckReturnFollowedByBrackets()
Dim ws As Worksheet
Dim newSheet As Worksheet
Dim lastRow As Long
Dim i As Long
Dim result As String
Dim cellValue As String
Dim resultRow As Long
Dim returnResult As String
Dim endResult As String
Dim overallResult As String
' 创建一个新工作表,并将其移动到第一个工作表之前
Set newSheet = ThisWorkbook.Worksheets.Add(Before:=ThisWorkbook.Sheets(1))
newSheet.Name = "Results"
' 在新工作表中添加标题
newSheet.Cells(1, 1).Value = "Sheet Name"
newSheet.Cells(1, 2).Value = "Return Result"
newSheet.Cells(1, 3).Value = "End Result"
newSheet.Cells(1, 4).Value = "Overall Result"
resultRow = 2
' 遍历所有工作表
For Each ws In ThisWorkbook.Worksheets
' 忽略结果工作表
If ws.Name <> "Results" Then
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
returnResult = "False"
endResult = "False"
overallResult = "False"
' 遍历第一列
For i = 1 To lastRow
If ws.Cells(i, 1).Value = "return" Then
If i + 1 <= lastRow Then
cellValue = ws.Cells(i + 1, 1).Value
If Left(cellValue, 1) = "<" And Right(cellValue, 1) = ">" Then
returnResult = "True"
End If
End If
End If
If ws.Cells(i, 1).Value = "end" Then
If i + 1 <= lastRow Then
cellValue = ws.Cells(i + 1, 1).Value
If Right(cellValue, 1) = "#" Then
endResult = "True"
End If
End If
End If
Next i
' 如果任一结果为 True,则整体结果为 True
If returnResult = "True" Or endResult = "True" Then
overallResult = "True"
End If
' 将结果写入新工作表
newSheet.Cells(resultRow, 1).Value = ws.Name
newSheet.Cells(resultRow, 2).Value = returnResult
newSheet.Cells(resultRow, 3).Value = endResult
newSheet.Cells(resultRow, 4).Value = overallResult
resultRow = resultRow + 1
End If
Next ws
End Sub
如何使用这个VBA代码:
- 打开你的Excel文件。
- 按
Alt + F11
打开VBA编辑器。 - 在VBA编辑器中,点击
Insert
->Module
插入一个新模块。 - 将上面的代码粘贴到新模块中。
- 关闭VBA编辑器。
- 回到Excel,按
Alt + F8
打开宏对话框,选择CheckReturnFollowedByBrackets
,然后点击运行
。
这个宏会遍历所有工作表,检查每个工作表中的第一列,找到值为 "return" 的单元格,并检查它的下一行是否以 "<" 开头并以 ">" 结尾。同时,它会找到值为 "end" 的单元格,并检查它的下一行是否以 "#" 结尾。结果会写入一个名为 "Results" 的新工作表中,并且如果某个工作表中任一结果为 "True",则在第四列输出 "True",否则输出 "False"。
结果
- Sheet1是正常的测试,以return结尾,设备名输出正常,因此为True
- Sheet2、6、3 均是模拟了缺漏配置,第四列输出为False
- Sheet7是正常的测试,以end结尾,设备名输出正常,因此为True