标题: [网络连接] [分享]批处理检测本地连接并自动连接宽带 [打印本页]
作者: neorobin 时间: 2009-12-9 11:29 标题: [分享]批处理检测本地连接并自动连接宽带
这个小工具主要用于一些宽带用户本地连接不稳定, 或者宽带老爱掉线的状况.
功能: 设置并保存宽带帐号密码, 从而实现断线自动检测并尝试重新连接.
特色: 由于本工具独立保存宽带帐号密码在一个文件里, 本工具获得正确的帐号密码后,
系统里只要宽带连接没有被删除, 改名, 帐号密码错误都不会影响本工具正常功能.
在第一次运行时需要填入帐号密码信息, 以后工具会自动读取保存好的信息进行工作.
第一次填好帐号和密码后, 可以关掉工具再重新打开, 想让工具隐藏界面运行直接回车就行了.
可对如下各种情况进行检测并作出相应处理:
宽带连接是否已建立或被删除, 帐号密码是否正确;
本地连接是否存在, 停用, 是否已连接.
本地连接成功后, 宽带是否连接上.
主要原理是分析 ipconfig 的输出来判断网络状态并实现自动连接宽带
当且仅第一次运行此脚本时, 脚本检测如果不存在 %windir%\PPPCFG.ini 文件, 将提示用户输入宽带连接的连接名, 用户名, 密码,
(必须是和网络连接文件夹中的某一个宽带连接匹配) 然后将这些信息保存在 %windir%\PPPCFG.ini 文件中, 作为以后自动调用连接
的依据. 只要 %windir%\PPPCFG.ini 这个文件还在, 以后运行就不用再输入什么信息了.
如果宽带配置比如 用户名和密码变了, 那么, 也只用运行一行命令:复制代码
删除失效的配置文件, 再重新输入一次就可以了.
1. 当有线网卡未装驱动或停用时, ipconfig 的输出中无本地连接的信息, 界面显示青兰色, ?本地连接(网卡物理地址)不存在或停用
2. 当有线网卡工作正常但未成功连接时(比如拔了网线), ipconfig 输出中显示本地连接状态为 Media disconnected,
以此判断本地连接断开, 界面显示红色, ╳本地连接(网卡物理地址)被断开
3. 当有线网卡工作正常且本地连接成功时, 但宽带连接未连接上时, ipconfig 的输出中无 PPP adapter 段,
以此判断宽带连接断开, 界面显示蓝色, 但提示信息只是指示: ╩本地连接(网卡物理地址)已连接上
此时, 如果已经存在保存了正确配置信息的 %windir%\PPPCFG.ini 文件, 将调用运行该文件自动连接宽带.
4. 当宽带成功连接, 连接过程的输出结果中将有 "已连接" 字样, 并且 ipconfig 的输出中也会出现 PPP adapter 段,
如此判断宽带连接成功以及是否保持, 如果再次断开, 就再次进入 3 的状态并且再次自动尝试恢复宽带连接.
宽带保持连接时, 界面显示绿色, ╬═╬本地连接和宽带连接(网卡物理地址)已连接上
下面是四种不同的状态界面合成一个图贴在这了:
[attach]2090[/attach]
另外 getmac 的输出也是可以指示网卡的停用, 断开的状态的, 有兴趣者可以加入对它的输出的分析, 让状态判断更准确到位.- @echo off&setlocal enabledelayedexpansion&(set PPPCFG=%windir%\PPPCFG.ini)
- if not exist !PPPCFG! goto begin
- if /i "%1" equ "hide" goto begin
- if /i "%1" equ "show" goto begin
- if /i "%1" equ "setAccount" (call :setAccount %1) && goto begin
- mode con lines=4 cols=58&(set /p show=需要显示小窗口界面吗^(y/n^)[直接回车=不显示]:)
- if /i "%show:~0,1%" equ "y" goto begin
- rem mshta vbscript:createobject("wscript.shell").run("%~nx0 hide",0)(window.close)&&exit
- (call :showWindow hide)
-
- :begin
- chcp 936 & cls & rem 后面的的判断全以中文代码页936输出为准
- (set sLC=本地连接)&(set sPPP=宽带连接)&(set fn=%windir%\~netmp)
- if not exist !PPPCFG! (call :setAccount %1)
-
- cls & mode con lines=2 cols=58
- :loop
- (ipconfig/all>!fn!)
- (set foundLC=false)&(set foundLCPA=false)&(set LCC=true)&(set LCPA=)&(set PPP_WAN=false)
- for /f "delims=" %%i in (!fn!) do (
- (set ln=%%i) & rem echo !ln!
- (set ln=!ln: =!) & (set ln=!ln:*本地连接:=本地连接:!)
- if "!ln:~0,5!" equ "!sLC!:" (
- (set foundLCPA=false)&(set foundLC=true)
- )
- if /i "!ln:~0,10!" equ "MediaState" (
- (set ln=!ln:*disconnected=disconnected!)
- if /i "!ln:~0,12!" equ "disconnected" (
- if /i "!foundLC!" equ "true" if /i "!foundLCPA!" equ "false" (set LCC=false)
- )
- )
- if /i "!ln:~0,15!" equ "PhysicalAddress" (
- if /i "!foundLC!" equ "true" if "!LCPA!" equ "" (
- (set foundLCPA=true)&(set ln=!ln:*:=!)&(set LCPA=!ln:~0,17!)
- )
- )
- if /i "!ln:~0,3!" equ "PPP" (set PPP_WAN=true)
- (set ln=!ln:*:=!)
- if /i "!ln:~0,3!" equ "WAN" (set PPP_WAN=true)
- )
- if /i "!foundLC!" equ "false" (set LCC=false)
- cls
- if !LCC! neq !LCC0! (set LCC0=!LCC!)&if /i "!LCC!" equ "false" (set /p=<nul) else (set /p=<nul)
- if !PPP_WAN! neq !PPP_WAN0! (set PPP_WAN0=!PPP_WAN!)&if /i "!PPP_WAN!" equ "false" (set /p=<nul) else (set /p= <nul)
- if /i "!PPP_WAN!" equ "true" (set sgn=╬═╬!sLC!和!sPPP!) else (set sgn=╩!sLC!)
- if /i "!LCC!" equ "false" (
- (color cf)&(title ╳!sLC!^(!LCPA!^)被断开) & echo ╳!sLC!^(!LCPA!^)被断开
- if /i "!foundLC!" equ "false" (color 3f)&(title ?!sLC!^(!LCPA!^)不存在或停用) & echo ?!sLC!^(!LCPA!^)不存在或停用
- (set PPP_WAN=false)
- ) else (
- (title !sgn!^(!LCPA!^)已连接上) & (set /p=!sgn!^(!LCPA!^)已连接上<nul)
- if /i "!PPP_WAN!" equ "true" (color 2f) else (color 9f)
- if /i "!PPP_WAN!" equ "false" (
- if not exist !PPPCFG! (call :setAccount %1) else (
- (call :getRASAutoDialName PPP_Name)
- for /f "eol=[ tokens=2,4,6 delims==|" %%a in (!PPPCFG!) do (
- (rasdial.exe "!PPP_Name!" %%b %%c)>!fn!
- )
- for /f "delims=" %%i in (!fn!) do (
- (set ln=%%i)
- if "!ln:~0,3!" equ "已连接" (color 2f)&(set PPP_WAN=true)&(set /p=!sPPP!已重新连上<nul)
- if "!ln:~0,6!" equ "远程访问错误" if /i "%1" equ "hide" (call :showWindow show)&exit
-
- if "!ln:~0,10!" equ "远程访问错误 623" (
- (msg %username% !sPPP! 未建立,或已删除或已改名,请检查后继续)&(start Control netconnections)&cls&pause
- )
- if "!ln:~0,10!" equ "远程访问错误 691" (msg %username% !sPPP!的用户名和/或密码错误,请重新输入)&(call :setAccount %1)
- )
- )
- )
- )
- ping -n 2 127.1>nul
- goto loop
- exit /b &rem End of main program
-
- :getRASAutoDialName
- echo wscript.echo CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\RAS AutoDial\Default\DefaultInternet")>%windir%\t~.vbs
- for /f "delims=" %%a in ('cscript //nologo %windir%\t~.vbs') do set "%1=%%a"
- exit /b
-
- :setAccount
- if /i "%1" equ "hide" (call :showWindow setAccount)&exit
- cls&color 9f&mode con lines=4 cols=80
- echo == 请输入!sPPP!配置信息并保存到文件 !PPPCFG! ==&echo.
- (set /p PPP_Username= 用户名:)
- (set /p PPP_password= 密码:)
- (call :getRASAutoDialName PPP_Name)
- echo [!sPPP!配置]>!PPPCFG!
- echo !sPPP!名称=!PPP_Name!^|用户名=!PPP_Username!^|密码=!PPP_password!>>!PPPCFG!
- echo ;请检查上面的信息是否正确, 否则请更正并保存^(注意分隔符^|不可删除或更改, 且不要加入任何多余的字符^)>>!PPPCFG!
- (start notepad !PPPCFG!)&pause
- mode con lines=2 cols=58
- exit /b
-
- :showWindow
- if /i "%1" equ "hide" (set intWindowStyle=0) else (set intWindowStyle=5)
- mshta vbscript:createobject("wscript.shell").run("%~nx0 %1",!intWindowStyle!)(window.close)&&exit
- exit /b
复制代码
[ 本帖最后由 neorobin 于 2009-12-10 20:11 编辑 ]
作者: kevinpeng 时间: 2009-12-9 21:30
LZ能否简单讲解一下上面代码的用法?看得人头大哦
作者: neorobin 时间: 2009-12-9 23:37
已经更新了, 第一次运行时, 只用填入 用户名, 密码, 宽带连接的名称由工具自己从系统中读取.
之后你可以关掉它, 再次启动时, 直接回车, 隐藏窗口运行.
[ 本帖最后由 neorobin 于 2009-12-10 20:15 编辑 ]
作者: SmallK 时间: 2010-6-24 01:16
不错,很实用,功能也比较全面.顶一下!
作者: SmallK 时间: 2010-6-25 02:49
测试了一下,发现当系统中没有PPPOE连接的情况下,脚本只能打开网络连接窗口。建议可否集成一个创建宽带连接的功能到脚本中?
另外,不知道你指的“小窗口界面”是什么意思,感觉不到明显的变化。
[ 本帖最后由 SmallK 于 2010-6-25 02:57 编辑 ]
作者: locoman 时间: 2011-1-20 01:26
谢谢分享!慢慢学习。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |