引言:批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言。批處理程序雖然是在命令行環境中運行,但不僅僅能使用命令行軟件,任何當前系統下可運行的程序都可以放在批處理文件中運行。
作者所在單位要部署一套溫濕度監控系統。該系統由華圖S400W無線溫濕度記錄儀、HE2400無線基站和監控軟件組成。一個或多個無線溫濕度記錄儀探測環境溫濕度,通過RF射頻傳送給該環境中的無線基站,無線基站經有線或無線局域網將監測數據通過UDP協議傳送至監控服務器。客戶端通過B/S結構可查看溫濕度記錄,接收報警。
該系統有40多個無線基站接入到二層交換機,局域網為核心、接入兩層結構,接入層交換機有30多臺,按部門劃分了30多個VLAN,為管理方便,部署中需將所有的無線基站劃歸同一VLAN。如果手工為所有無線基站調整VLAN、分配固定IP,工作量龐大,因此想用批處理來實現。

圖1 網絡拓撲圖
首先:每個無線基站均有MAC地址,先統一把所有無線基站逐一連接筆記本電腦,預先設置好固定IP,192.168.31.0/24網段,并記錄下其MAC地址;
然后,將所有無線基站部署到各監測點,開機;
最后,在局域網中一臺電腦上運行批處理程序,輸入MAC地址,即可找到該基站所連接的交換機端口,將端口劃至VLAN 31。
批處理中需先Telnet至核心交換機,查找指定MAC所直連的二層交換機,再Telnet至二層交換機,找到該MAC所連接的端口,并修改端口的VLAN號。然而批處理在使用Telnet時無法自動輸入Telnet登錄密碼,而VBscript腳本使用SendKeys命令能做到,因此若把二者結合使用,就能達到想要的效果。網絡拓撲如圖1所示。
FindMac.bat批處理內容如下:
@rem 第一步:輸入MAC地址,Telnet核心交換機查找該MAC所連接的核心交換機端口
@set /p mymac=請輸入要查找的MAC:
@del c: elcore.vbs
@echo on error resumenext >>c: elcore.vbs
@echo dim WshShe ll>>c: elcore.vbs
@echo Set WshSh ell=WScript.CreateObje ct("WScript.Shell")>>c: elcore.vbs
@echo WshShell.run"c md">>c: elcore.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elc ore.vbs
@echo WScript.Sleep 200>>c: elcore.vbs
@echo WshShell.SendKeys"telnet 192.16 8.1.254{ENTER}">>c: elcore.vbs
@echo WScript.Sleep 100>>c: elcore.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elcore.vbs
@echo WScript.Sleep 2000>>c: elcore.vbs
@echo WshShell.SendKey s"jikon {ENT ER}">>c: elcore.vbs
@echo WScript.Sleep 2000>>c: elcore.vbs
@echo WshShell.Send Keys"sh mac add add %m ymac%{ENTER}">>c: elcore.vbs
@echo WScript.Sleep 1000>>c: elcore.vbs
@echo WshShell.SendKeys"sh cdp nei{ENT ER}">>c: elcore.vbs
@echo WScript.Sleep 1000>>c: elcore.vbs
@call c: elcore.vbs
@rem 第二步:輸入二層交換機的管理IP,查找該MAC所連接的二層交換機端口
@cls
@set /p sw=請輸入該MAC所連接的二層交換機IP:
@del c: elsw.vbs
@echo on error resumenext >>c: elsw.vbs
@echo dim WshSh ell>>c: elsw.vbs
@echo Set WshSh ell= WScript.CreateObject("WScript.Shell")>>c: e lsw.vbs
@echo WshShell.ru n"cmd">>c: elsw.vbs
@echo WshShell.App Activate"c:windowssy stem32cmd.exe">>c: elsw.vbs
@echo WScript.Sleep 200>>c: elsw.vbs
@echo WshShell.Send Keys"telnet %sw%{EN TER}">>c: elsw.vbs
@echo WScript.Sleep 100>>c: elsw.vbs
@echo WshShell.App Activate"telnet.exe ">>c: elsw.vbs
@echo WScript.Sleep 2000>>c: elsw.vbs
@echo WshShell.SendKeys"jikong{EN TE R}">>c: elsw.vbs
@echo WScript.Sleep 2000>>c: elsw.vbs
@echo WshShell.SendKeys"sh mac addadd%mymac%{ENTER}">>c: elsw.vbs
@echo WScript.Sleep 1000>>c: elsw.vbs
@echo WshShell.SendKeys"sh cdp nei{EN TER}">>c: elsw.vbs
@echo WScript.Sleep 1000>>c: elsw.vbs
@call c: elsw.vbs
@rem 第三步:輸入二層交換機的管理IP,查找該MAC直連的二層交換機端口
@cls
@set /p swzl=請輸入該MAC所直連的二層交換機IP:
@del c: elswzl.vbs
@echoon error resume next >>c: elswzl.vbs
@echodim WshShell>>c: elswzl.vbs
@echo Set WshSh ell= WScript.CreateObject("WScript.Shell")>>c: elswzl.vbs
@echo WshShell.run"cmd">>c: elswzl.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elswzl.vbs
@echo WScript.Sleep 200>>c: elswzl.vbs
@echo WshShell.SendKeys"telnet %swz l%{ENTER}">>c: elsw zl.vbs
@echo WScript.Sleep 100>>c: elswzl.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elswzl.vbs
@echo WScript.Sleep 2000>>c: elswzl.vbs
@echo WshShell.SendKeys"jik ong{ENT ER}">>c: elswzl.vbs
@echo WScript.Sleep 2000>>c: elswzl.vbs
@echo WshShell.Sen dKeys"sh mac add add%mymac%{ENTER}">>c: elswzl.vbs
@echo WScript.Sleep 1000>>c: elswzl.vbs
@call c: elswzl.vbs
@rem 第四步:輸入二層交換機端口號,修改VLAN
@cls
@set /p swzldk=請輸入該MAC所直連的二層交換機端口號:
@del c: elswzldk.vbs
@echo on error resume next >>c: elswzldk.vbs
@echo dim WshShell>>c: elswzldk.vbs
@echo Set WshShell=WScript.Creat eObj ec t("WScript.Shell")> >c: elswzldk.vbs
@echo WshShell.run"cmd">>c: elswzldk.vbs
@echo WshShell.App Activate"c:windowssys tem32cmd.exe">>c: elswzldk.vbs
@echo WScript.Sleep 200>>c: elswzldk.vbs
@echo WshShell.SendKeys"telnet %swzl%{ENTER}">>c: elswzl dk.vbs
@echo WScript.Sleep 100>>c: elswzldk.vbs
@echo WshShell.AppActivate"telnet.exe">>c: elswzldk.vbs
@echo WScript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"jikong{EN TER}">>c: elswzldk.vbs
@echo WScript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"en{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo Wsh Shell.SendKeys "jikong{EN TER}">>c: elswzldk.vbs
@echo WSc ript.Sleep 2000>>c: elswzldk.vbs
@echo WshShell.SendKeys"conf t{ENT ER}">>c: elswzldk.vbs
@echo WSc ript.Sleep 1000>>c: elswzldk.vbs
@echo Wsh Sh ell.SendKeys"int f0/%swzld k%{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"swit acce vlan 31{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"no shut{EN TER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"end{ENTER}">>c: elswzldk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@echo WshShell.SendKeys"wr{ENTER}">>c: elswzl dk.vbs
@echo WScript.Sleep 1000>>c: elswzldk.vbs
@call c: elswzldk.vbs
@rem 清除所定義的變量
@set mymac=
@set sw=
@set swzl=
@set swzldk=
批處理運行過程的解釋:

圖2 輸入MAC地址

圖3 核心交換機連接拓撲

圖4 輸入二層交換機IP地址

圖5 二層交換機連接拓撲

圖6 輸入直連的二層交換機IP地址
第一步:定義變量mymac,讓用戶從鍵盤輸入無線基站的MAC地址,將第一段代碼追加到telcore.vbs文件并調用,即Telnet核心交換機192.168.1.254,查找該MAC所連接的核心交換機端口。
拓撲中顯示核心交換機通過光纖連接了9臺二層交換機,該MAC地址連接在Gi3/1端口所連接的二層交換機上,該二層交換機名稱是Z2FN1,對telswzl.vbs的調用完成。用戶查找交換機hostname命名表,找到Z2FN1的IP是192.168.1.201。
第二步:定義變量sw,讓用戶從鍵盤輸入二層交換機Z2FN1的管理IP地址192.168.1.201,將第二段代碼追加到telsw.vbs文件并調用,即Telnet二層交換機 192.168.1.201,查找該MAC所連接的二層交換機端口。
拓撲中顯示二層交換機Z2FN1共連接了3臺交換機機,即Gi0/1口通過光纖連接核心交換機、GI0/2千兆電口連接二層交換機Z2FN2、百兆電口Fa0/46連接二層交換機Z2FD1。該MAC地址連接在Gi0/2端口所連接的二層交換機上,該二層交換機名稱是Z2FN2,對telsw.vbs的調用完成。用戶查找交換機hostname命名表,找到Z2FN2的IP是192.168.1.202。
第三步:定義變量swzl,讓用戶從鍵盤輸入二層交換機Z2FN2的管理IP地址192.168.1.202,將第三段代碼追加到telswzl.vbs文件并調用,即Telnet二層交換機 192.168.1.202,查找該MAC直連的二層交換機端口。
顯示該無線基站連接在192.168.1.202這臺二層交換機的Fa0/8百兆電口上,對telswzl.vbs的調用完成。

圖7 找到端口號

圖8 輸入端口號

圖9 將端口加入VLAN31
第四步:定義變量swzldk,讓用戶從鍵盤輸入端口號8,將第四段代碼追加到telswzldk.vbs文件并調用,將端口加入VLAN 31,啟用端口并保存。
最后,刪除所定義的4個變量。至此批處理結束。
如果網絡拓撲為核心層、匯聚層、接入層的三層結構,此過程還要增加一個步驟。顯然,該批處理還不夠智能化,最理想的結果是用戶只需輸入MAC地址,所有的工作自動完成,因此尚需進一步優化,而其復雜度和代碼量將大大增加。