主要實現功能: 在 "192.168.0.120" and "192.168.0.8" 之間切換網關地址
有幾點需要注意的:
1. 帶傳回值函數需聲明變數來接收其傳回值。否則如 objItem.EnableStatic(strIPAddress, strSubnetMask)不給定傳回值將出現
編譯器錯誤: 調用過程(Sub)時不能使用括弧
(為什嗎?)
2.對於VARIANT 資料型別為數組的資料,有三種訪問方式:
法一:直接用迴圈遍曆數組
' For Each strIPAddress in objItem.IPAddress
' WScript.Echo strIPAddress
' Next
法二: 用數組上下標作為迴圈變數取值範圍遍曆
For i=LBound(objItem.IPAddress) _
to UBound(objItem.IPAddress)
...
Next
法三:直接給定數組下標,如
WScript.Echo strGateway(0)
本程式缺陷:
顯示本地串連屬性時前後代碼重複,可用函數來代替
'##########################################<br />'<case: find IP address by MacAddress, set static ip addres,s and change gateway between "192.168.0.120" and "192.168.0.8"<br />'connect to a local machine only, support can be found from ms-help://MS.MSDNQTR.v90.en/wmisdk/wmi/wmi_tasks__networking.htm<br />'for remote connection,please see ms-help://MS.MSDNQTR.v90.en/wmisdk/wmi/connecting_to_wmi_on_a_remote_computer.htm<br />'Be careful,when we call WMI methods, if it has return, we must have a variable for recieving the returns<br />strComputer = "."<br />strIPAddress = Array("192.168.0.131")<br />strSubnetMask =Array("255.255.255.0")<br />strGateway1 = Array("192.168.0.120")<br />strGateway2 = Array("192.168.0.8")<br />strGatewayMetric = Array(1)<br />Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")<br />Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter where " _<br /> & "NetConnectionID = '本地串連'")<br />For Each objItem in colItems<br /> strMacAddress = objItem.MACAddress<br /> WScript.Echo strMacAddress<br />Next<br />Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration")<br />For Each objItem in colItems<br />'由於本機有兩個相同MAC地址Win32_NetworkAdapterConfiguration對象,因此需加是否為空白判斷<br />'原因是當IPAddress為空白時,迴圈For Each strIPAddress in objItem.IPAddress會提示錯誤:<br />'執行階段錯誤: 對象不是一個集合<br /> If Not IsNull(objItem.IPAddress) Then<br /> If objItem.MACAddress = strMacAddress Then<br />'法一:用迴圈遍曆數組<br />' For Each strIPAddress in objItem.IPAddress<br />' WScript.Echo strIPAddress<br />' Next<br />'法二: 用數組界限遍曆<br /> For i=LBound(objItem.IPAddress) _<br /> to UBound(objItem.IPAddress)<br /> For j=LBound(objItem.IPSubnet) _<br /> to UBound(objItem.IPSubnet)<br /> For k=LBound(objItem.DefaultIPGateway) _<br /> to UBound(objItem.DefaultIPGateway)<br /> WScript.Echo "IPAddress:" & objItem.IPAddress(i)& VBNewLine _<br /> & "IPSubnet: " & objItem.IPSubnet(j) & VBNewLine _<br /> & "DefaultIPGateway: " & objItem.DefaultIPGateway(k)<br /> If objItem.DefaultIPGateway(k) = "192.168.0.8" Then<br /> strGateway = strGateway1<br /> Else strGateway = strGateway2<br /> End If</p><p>'法三:直接給定數組下標<br /> ’For l=LBound(strGateway) to UBound(strGateway)<br /> WScript.Echo strGateway(0)<br /> ‘Next<br /> Next<br /> Next<br /> Next </p><p>'SetGateways method only works when the Network Interface Card (NIC) is in the static IP mode.<br /> errEnable = objItem.EnableStatic( _<br /> strIPAddress, strSubnetMask)<br /> errGateways = objItem.SetGateways(_<br /> strGateway, strGatewaymetric)</p><p> End If<br /> End If<br />Next</p><p>WScript.Echo VBNewLine & "After rest ip address: " & VBNewLine<br />Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration")<br />For Each objItem in colItems<br /> If Not IsNull(objItem.IPAddress) Then<br /> If objItem.MACAddress = strMacAddress Then<br /> For i=LBound(objItem.IPAddress) _<br /> to UBound(objItem.IPAddress)<br /> For j=LBound(objItem.IPSubnet) _<br /> to UBound(objItem.IPSubnet)<br /> For k=LBound(objItem.DefaultIPGateway) _<br /> to UBound(objItem.DefaultIPGateway)<br /> WScript.Echo "IPAddress:" & objItem.IPAddress(i)& VBNewLine _<br /> & "IPSubnet: " & objItem.IPSubnet(j) & VBNewLine _<br /> & "DefaultIPGateway: " & objItem.DefaultIPGateway(k)<br /> If objItem.DefaultIPGateway(k) = "192.168.0.8" Then<br /> strGateway = strGateway1<br /> Else strGateway = strGateway2<br /> End If<br /> For l=LBound(strGateway) to UBound(strGateway)<br /> WScript.Echo strGateway(l)<br /> Next<br /> Next<br /> Next<br /> Next</p><p> End If<br /> End If<br />Next<br />'/case><br />'##########################################<br />
當然,還有更簡單的命令列方法
@echo off<br />netsh interface ip show address | find "192.168.0.120"<br />if %errorlevel%==0 (<br />goto :To8<br />) else (<br />netsh interface ip show address | find "192.168.0.8" && goto :To120<br />)</p><p>:To8<br />echo change gateway from 192.168.0.120 to 192.168.0.8<br />netsh interface ip set address "本地串連" static 192.168.0.131 255.255.255.0 192.168.0.8 1<br />pause<br />goto :EOF</p><p>:To120<br />echo change gateway from 192.168.0.8 to 192.168.0.120<br />netsh interface ip set address "本地串連" static 192.168.0.131 255.255.255.0 192.168.0.120 1<br />pause<br />goto :EOF