[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[网络连接] [分享]批处理检测本地连接并自动连接宽带

这个小工具主要用于一些宽带用户本地连接不稳定, 或者宽带老爱掉线的状况.

功能: 设置并保存宽带帐号密码, 从而实现断线自动检测并尝试重新连接.
特色: 由于本工具独立保存宽带帐号密码在一个文件里, 本工具获得正确的帐号密码后,
      系统里只要宽带连接没有被删除, 改名, 帐号密码错误都不会影响本工具正常功能.

在第一次运行时需要填入帐号密码信息, 以后工具会自动读取保存好的信息进行工作.
第一次填好帐号和密码后, 可以关掉工具再重新打开, 想让工具隐藏界面运行直接回车就行了.

可对如下各种情况进行检测并作出相应处理:
  宽带连接是否已建立或被删除, 帐号密码是否正确;
  本地连接是否存在, 停用, 是否已连接.
  本地连接成功后, 宽带是否连接上.

主要原理是分析 ipconfig 的输出来判断网络状态并实现自动连接宽带

当且仅第一次运行此脚本时, 脚本检测如果不存在 %windir%\PPPCFG.ini 文件, 将提示用户输入宽带连接的连接名, 用户名, 密码,
(必须是和网络连接文件夹中的某一个宽带连接匹配) 然后将这些信息保存在 %windir%\PPPCFG.ini 文件中, 作为以后自动调用连接
的依据. 只要 %windir%\PPPCFG.ini 这个文件还在, 以后运行就不用再输入什么信息了.
如果宽带配置比如 用户名和密码变了, 那么, 也只用运行一行命令:
  1. del %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 的输出也是可以指示网卡的停用, 断开的状态的, 有兴趣者可以加入对它的输出的分析, 让状态判断更准确到位.
  1. @echo off&setlocal enabledelayedexpansion&(set PPPCFG=%windir%\PPPCFG.ini)
  2. if not exist !PPPCFG! goto begin
  3. if /i "%1" equ "hide" goto begin
  4. if /i "%1" equ "show" goto begin
  5. if /i "%1" equ "setAccount" (call :setAccount %1) && goto begin
  6. mode con lines=4 cols=58&(set /p show=需要显示小窗口界面吗^(y/n^)[直接回车=不显示]:)
  7. if /i "%show:~0,1%" equ "y" goto begin
  8. rem mshta vbscript:createobject("wscript.shell").run("%~nx0 hide",0)(window.close)&&exit
  9. (call :showWindow hide)
  10. :begin
  11. chcp 936 & cls & rem 后面的的判断全以中文代码页936输出为准
  12. (set sLC=本地连接)&(set sPPP=宽带连接)&(set fn=%windir%\~netmp)
  13. if not exist !PPPCFG! (call :setAccount %1)
  14. cls & mode con lines=2 cols=58
  15. :loop
  16. (ipconfig/all>!fn!)
  17. (set foundLC=false)&(set foundLCPA=false)&(set LCC=true)&(set LCPA=)&(set PPP_WAN=false)
  18. for /f "delims=" %%i in (!fn!) do (
  19.   (set ln=%%i) & rem echo !ln!
  20.   (set ln=!ln: =!) & (set ln=!ln:*本地连接:=本地连接:!)
  21.   if "!ln:~0,5!" equ "!sLC!:" (
  22.     (set foundLCPA=false)&(set foundLC=true)
  23.   )
  24.   if /i "!ln:~0,10!" equ "MediaState" (
  25.     (set ln=!ln:*disconnected=disconnected!)
  26.     if /i "!ln:~0,12!" equ "disconnected" (
  27.       if /i "!foundLC!" equ "true" if /i "!foundLCPA!" equ "false" (set LCC=false)
  28.     )
  29.   )
  30.   if /i "!ln:~0,15!" equ "PhysicalAddress" (
  31.     if /i "!foundLC!" equ "true" if "!LCPA!" equ "" (
  32.       (set foundLCPA=true)&(set ln=!ln:*:=!)&(set LCPA=!ln:~0,17!)
  33.     )
  34.   )
  35.   if /i "!ln:~0,3!" equ "PPP" (set PPP_WAN=true)
  36.   (set ln=!ln:*:=!)
  37.   if /i "!ln:~0,3!" equ "WAN" (set PPP_WAN=true)
  38. )
  39. if /i "!foundLC!" equ "false" (set LCC=false)
  40. cls
  41. if !LCC! neq !LCC0! (set LCC0=!LCC!)&if /i "!LCC!" equ "false" (set /p=<nul) else (set /p=<nul)
  42. if !PPP_WAN! neq !PPP_WAN0! (set PPP_WAN0=!PPP_WAN!)&if /i "!PPP_WAN!" equ "false" (set /p=<nul) else (set /p=      <nul)
  43. if /i "!PPP_WAN!" equ "true" (set sgn=╬═╬!sLC!和!sPPP!) else (set sgn=╩!sLC!)
  44. if /i "!LCC!" equ "false" (
  45.   (color cf)&(title ╳!sLC!^(!LCPA!^)被断开) & echo ╳!sLC!^(!LCPA!^)被断开
  46.   if /i "!foundLC!" equ "false" (color 3f)&(title ?!sLC!^(!LCPA!^)不存在或停用) & echo ?!sLC!^(!LCPA!^)不存在或停用
  47.   (set PPP_WAN=false)
  48. ) else (
  49.   (title !sgn!^(!LCPA!^)已连接上) & (set /p=!sgn!^(!LCPA!^)已连接上<nul)
  50.   if /i "!PPP_WAN!" equ "true" (color 2f) else (color 9f)
  51.   if /i "!PPP_WAN!" equ "false" (
  52.     if not exist !PPPCFG! (call :setAccount %1) else (
  53.       (call :getRASAutoDialName PPP_Name)
  54.       for /f "eol=[ tokens=2,4,6 delims==|" %%a in (!PPPCFG!) do (
  55.         (rasdial.exe "!PPP_Name!" %%b %%c)>!fn!
  56.       )
  57.       for /f "delims=" %%i in (!fn!) do (
  58.         (set ln=%%i)
  59.         if "!ln:~0,3!" equ "已连接" (color 2f)&(set PPP_WAN=true)&(set /p=!sPPP!已重新连上<nul)
  60.         if "!ln:~0,6!" equ "远程访问错误" if /i "%1" equ "hide" (call :showWindow show)&exit
  61.         if "!ln:~0,10!" equ "远程访问错误 623" (
  62.           (msg %username% !sPPP! 未建立,或已删除或已改名,请检查后继续)&(start Control netconnections)&cls&pause
  63.         )
  64.         if "!ln:~0,10!" equ "远程访问错误 691" (msg %username% !sPPP!的用户名和/或密码错误,请重新输入)&(call :setAccount %1)
  65.       )
  66.     )
  67.   )
  68. )
  69. ping -n 2 127.1>nul
  70. goto loop
  71. exit /b                                  &rem End of main program
  72. :getRASAutoDialName
  73. echo wscript.echo CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\RAS AutoDial\Default\DefaultInternet")>%windir%\t~.vbs
  74. for /f "delims=" %%a in ('cscript //nologo %windir%\t~.vbs') do set "%1=%%a"
  75. exit /b
  76. :setAccount
  77. if /i "%1" equ "hide" (call :showWindow setAccount)&exit
  78. cls&color 9f&mode con lines=4 cols=80
  79. echo == 请输入!sPPP!配置信息并保存到文件 !PPPCFG! ==&echo.
  80. (set /p PPP_Username=                       用户名:)
  81. (set /p PPP_password=                         密码:)
  82. (call :getRASAutoDialName PPP_Name)
  83. echo [!sPPP!配置]>!PPPCFG!
  84. echo !sPPP!名称=!PPP_Name!^|用户名=!PPP_Username!^|密码=!PPP_password!>>!PPPCFG!
  85. echo ;请检查上面的信息是否正确, 否则请更正并保存^(注意分隔符^|不可删除或更改, 且不要加入任何多余的字符^)>>!PPPCFG!
  86. (start notepad !PPPCFG!)&pause
  87. mode con lines=2 cols=58
  88. exit /b
  89. :showWindow
  90. if /i "%1" equ "hide" (set intWindowStyle=0) else (set intWindowStyle=5)
  91. mshta vbscript:createobject("wscript.shell").run("%~nx0 %1",!intWindowStyle!)(window.close)&&exit
  92. exit /b
复制代码
[ 本帖最后由 neorobin 于 2009-12-10 20:11 编辑 ]
1

评分人数

LZ能否简单讲解一下上面代码的用法?看得人头大哦

TOP

已经更新了, 第一次运行时, 只用填入 用户名, 密码, 宽带连接的名称由工具自己从系统中读取.
之后你可以关掉它, 再次启动时, 直接回车, 隐藏窗口运行.

[ 本帖最后由 neorobin 于 2009-12-10 20:15 编辑 ]

TOP

不错,很实用,功能也比较全面.顶一下!
虚心使人进步 细节成就完美

TOP

测试了一下,发现当系统中没有PPPOE连接的情况下,脚本只能打开网络连接窗口。建议可否集成一个创建宽带连接的功能到脚本中?
另外,不知道你指的“小窗口界面”是什么意思,感觉不到明显的变化。

[ 本帖最后由 SmallK 于 2010-6-25 02:57 编辑 ]
虚心使人进步 细节成就完美

TOP

谢谢分享!慢慢学习。

TOP

返回列表