Board logo

标题: [已解决]30元求助一ADSL自动拨号的批处理 [打印本页]

作者: samiking    时间: 2013-9-5 01:03     标题: [已解决]30元求助一ADSL自动拨号的批处理

具体报酬:30元人民币
支付方式:支付宝
联系方式:QQ25965079
有效期限:2013年09月10日之前。
需求描述:
想要一个ADSL自动拨号的批处理,可以设置多少分钟断线重拨,拨号成功后自动把ppp IP地址导入ip.txt ,(不成功则重拨,间隔5秒,重拨次数5次,还不成功,显示错误提示"拨号出错")每次断线重拨都要对比IP.txt文件里的IP,重复就断线重拨(间隔5秒),直到不重复为止. 批处理的开头先查看创建ip.txt的日期时间跟现在的日期时间对比,超过24小时,删除重建 (适用于xp/2003 系统)
作者: batman    时间: 2013-9-5 11:39

本帖最后由 batman 于 2013-9-5 19:53 编辑

变量自己改,如果问题解决了,请将钱捐到论坛基金,具体事项找Batcher。。。
  1. '初始化全局变量
  2. Dim AdslName, AdslUser, AdslPassword, Url, Ip, File, Text, OK, Times, StartTime
  3. AdslName = "xxxx"
  4. AdslUser = "xxxx"
  5. AdslPassword = "xxxxxx"
  6. Url = "http://iframe.ip138.com/ic.asp"
  7. Ip = "www.baidu.com"
  8. File = "ip.txt"
  9. OK = vbNullString
  10. '输入断网时间
  11. Do Until Times <> 0
  12.   Times = Int(InputBox("请输入自动断网的时间,单位为分钟,默认为60分钟",,60))
  13. Loop
  14. StartTime = Now
  15. '判断ip.txt最后一次访问时间到现在是不是过了24小时
  16. GetText File, "test", Null
  17. '拔号循环
  18. Adsl "disconnect"
  19. WScript.Sleep 1000
  20. For i = 1 To 5
  21.   Adsl "connect"
  22.   WScript.Sleep 1000
  23.   Juge
  24.   If Juge = 0 Then
  25.     GetIp : Text = vbNullString
  26.     GetText File, "read", Null
  27.     If InStr(Text, GetIp) = 0 Then
  28.       GetText File, "write", GetIp
  29.       OK = "ok"
  30.       Exit For
  31.       Else
  32.       Adsl "disconnect"
  33.     End If
  34.    End If
  35. Next
  36. If OK <> "ok" Then
  37.   MsgBox "拔号出错"
  38.   WScript.Quit
  39. End if
  40. '在没到达断网时间内每10秒检测一次网络发现断线后重拔
  41. Do
  42.   If DateDiff("s", StartTime, Now) >= Times * 60 Then
  43.     Adsl "disconect"
  44.     WScript.Quit
  45.   End If  
  46.   Juge
  47.   If Juge = 1 Then
  48.     Adsl "connect"
  49.   End If
  50.   WScript.Sleep 10 * 1000
  51. Loop
  52. Function Juge
  53.   '判断网络通畅
  54.   Juge = 1
  55.   Dim objWMI, objItems, objItem
  56.   Set objWMI = GetObject("Winmgmts:")
  57.   Set objItems = objWMI.ExecQuery _
  58.     ("Select * From Win32_PingStatus " _
  59.       & "Where Address = '" & Ip & "'")
  60.   For Each objItem In objItems
  61.     If objItem.ResponseTime > 0 Then Juge = 0
  62.   Next
  63.   Set objItems = Nothing
  64.   Set objWMI = Nothing
  65. End Function
  66. Function Adsl(Types)
  67.   'ADSL拔号版块
  68.   Dim objSHELL
  69.   Set objSHELL = CreateObject("Wscript.Shell")
  70.   If Types = "connect" Then
  71.     objSHELL.Run "rasdial.exe " & AdslName _
  72.       & " " & AdslUser & " " & Adslpassword, 0, 0
  73.     Else
  74.     objSHELL.Run "rasdial.exe /disconnect", 0, 0
  75.   End If
  76.   Set objSHELL = Nothing
  77. End Function
  78. Function GetIp
  79.   '获取外网IP
  80.   Dim objDOM, Arr, Arr2
  81.   Set objDOM = WScript.GetObject(Url)  
  82.   Do Until objDOM.Readystate = "complete"
  83.     WScript.Sleep 200
  84.   Loop
  85.   Arr = Split(objDOM.DocumentElement.Innertext, "[")
  86.   Arr2 = Split(Arr(1), "]")
  87.   GetIp = Arr2(0)
  88.   Set objDOM = Nothing
  89. End Function
  90. Function GetText(File, Types, GetIp)
  91.   '文本读、写版块
  92.   Dim objFSO
  93.   Set objFSO = CreateObject("Scripting.FileSystemObject")
  94.   If Not objFSO.FileExists(File) Then _
  95.     objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  96.   If Types = "read" Then
  97.     Text = objFSO.OpenTextFile(File).ReadAll
  98.     Else
  99.     If Types = "write" Then
  100.       objFSO.OpenTextFile(File, 8).WriteLine GetIp
  101.       Else
  102.       oldday = objFSO.GetFile(File).DateLastModified
  103.       If DateDiff("h", oldday, Now) > 24 Then _
  104.         objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  105.      End If
  106.   End If
  107.   Set objFSO = Nothing
  108. End Function
复制代码

作者: samiking    时间: 2013-9-5 15:16

编译出错,运行不了.显示"变量出错..Dim不是内部命令或外部命令...url不是内部命令或外部命令".而且前提有个功能没有实现,就是可以手动设置多少分钟断开连接.比如输入10,20....60分钟等.由于批处理我是初学,只是个小白,代码只看懂小部分,希望版主能不能编译通过了再发.
变量我只修改了三个部分
AdslName = "xxx" 我改成 宽带连接
AdslUser = "xxxx" 我改成 拨号帐号
AdslPassword = "xxxxxx"  我改成 拨号密码

运行系统 win2003
作者: batman    时间: 2013-9-5 15:41

本帖最后由 batman 于 2013-9-5 15:45 编辑

回复 3# samiking


    这是vbs,没想到你这都不知道,保存文件为test.vbs,然后前提条件你在顶楼并没讲清楚。。。
作者: samiking    时间: 2013-9-5 16:58

本帖最后由 samiking 于 2013-9-5 17:11 编辑

我确实不知道,对编程也是刚刚接触.不过前提条件我确实说清楚了,只是放在前面,你没注意...
照你所说,保存为text.vbs 编译还是无法通过,无法自动拨号,我已经把ADSL 帐号,密码 加入变量里了,运行好久,弹出对话 拨号错误
作者: batman    时间: 2013-9-5 17:14

单位没有拔号测试条件,回家再来调试代码。。。
作者: batman    时间: 2013-9-5 18:47

我已在家调试了代码,请测试先。。。
作者: samiking    时间: 2013-9-5 21:55

本帖最后由 samiking 于 2013-9-5 23:40 编辑

好的,我试试先
已测试,自动拨号会上号,有几个问题:
1,设置多少分钟自动断线重连,这个不会循环,如果设置10分钟,那就每10分钟断一次
2,ip.txt只会记录第一次,我想要每次都记,这样对比才有意思,避免拨号重复
作者: batman    时间: 2013-9-5 23:20

回复 8# samiking


    请及时反馈情况。。。
作者: batman    时间: 2013-9-6 08:10

楼主一直在描述问题,一直没有描述清楚。。。。
PS:ip.txt肯定不会只记录第一次的,这个我都测试了很多次了(xp)
  1. '初始化全局变量
  2. Dim AdslName, AdslUser, AdslPassword, Url, Ip, File, Text, OK, Times
  3. AdslName = "xxxx"
  4. AdslUser = "xxxx"
  5. AdslPassword = "xxxxxx"
  6. Url = "http://iframe.ip138.com/ic.asp"
  7. Ip = "www.baidu.com"
  8. File = "ip.txt"
  9. OK = vbNullString
  10. '输入断网时间
  11. Do Until Times <> 0
  12.   Times = Int(InputBox("请输入自动断网重连的时间,单位为分钟,默认为10分钟",,10))
  13. Loop
  14. '判断ip.txt最后一次访问时间到现在是不是过了24小时
  15. GetText File, "test", Null
  16. '拔号循环
  17. Adsl "disconnect"
  18. WScript.Sleep 1000
  19. For i = 1 To 5
  20.   Adsl "connect"
  21.   WScript.Sleep 1000
  22.   Juge
  23.   If Juge = 0 Then
  24.     GetIp : Text = vbNullString
  25.     GetText File, "read", Null
  26.     If InStr(Text, GetIp) = 0 Then
  27.       GetText File, "write", GetIp
  28.       OK = "ok"
  29.       Exit For
  30.       Else
  31.       Adsl "disconnect"
  32.     End If
  33.    End If
  34. Next
  35. If OK <> "ok" Then
  36.   MsgBox "拔号出错"
  37.   WScript.Quit
  38. End if
  39. '每Times分钟断网重连循环
  40. Do
  41.   WScript.Sleep Times * 60 * 1000
  42.   Adsl "disconnect"
  43.   WScript.Sleep 1 * 1000
  44.   Adsl "connect"
  45. Loop
  46. Function Juge
  47.   '判断网络通畅
  48.   Juge = 1
  49.   Dim objWMI, objItems, objItem
  50.   Set objWMI = GetObject("Winmgmts:")
  51.   Set objItems = objWMI.ExecQuery _
  52.     ("Select * From Win32_PingStatus " _
  53.       & "Where Address = '" & Ip & "'")
  54.   For Each objItem In objItems
  55.     If objItem.ResponseTime > 0 Then Juge = 0
  56.   Next
  57.   Set objItems = Nothing
  58.   Set objWMI = Nothing
  59. End Function
  60. Function Adsl(Types)
  61.   'ADSL拔号版块
  62.   Dim objSHELL
  63.   Set objSHELL = CreateObject("Wscript.Shell")
  64.   If Types = "connect" Then
  65.     objSHELL.Run "rasdial.exe " & AdslName _
  66.       & " " & AdslUser & " " & Adslpassword, 0, 0
  67.     Else
  68.     objSHELL.Run "rasdial.exe /disconnect", 0, 0
  69.   End If
  70.   Set objSHELL = Nothing
  71. End Function
  72. Function GetIp
  73.   '获取外网IP
  74.   Dim objDOM, Arr, Arr2
  75.   Set objDOM = WScript.GetObject(Url)  
  76.   Do Until objDOM.Readystate = "complete"
  77.     WScript.Sleep 200
  78.   Loop
  79.   Arr = Split(objDOM.DocumentElement.Innertext, "[")
  80.   Arr2 = Split(Arr(1), "]")
  81.   GetIp = Arr2(0)
  82.   Set objDOM = Nothing
  83. End Function
  84. Function GetText(File, Types, GetIp)
  85.   '文本读、写版块
  86.   Dim objFSO
  87.   Set objFSO = CreateObject("Scripting.FileSystemObject")
  88.   If Not objFSO.FileExists(File) Then _
  89.     objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  90.   If Types = "read" Then
  91.     Text = objFSO.OpenTextFile(File).ReadAll
  92.     Else
  93.     If Types = "write" Then
  94.       objFSO.OpenTextFile(File, 8).WriteLine GetIp
  95.       Else
  96.       oldday = objFSO.GetFile(File).DateLastModified
  97.       If DateDiff("h", oldday, Now) > 24 Then _
  98.         objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  99.      End If
  100.   End If
  101.   Set objFSO = Nothing
  102. End Function
复制代码

作者: samiking    时间: 2013-9-6 08:59

刚测试,还是不行,版主.这次ip一个也记录不了.
错误提示:
行 82
字符 3
我加入点个人理解
'每Times分钟断网重连循环

Do

  WScript.Sleep Times * 60 * 1000

  Adsl "disconnect"

  WScript.Sleep 1 * 1000

  Adsl "connect"

Loop

这个模块里,是不是应该加入调用 获取IP和读写版块 这样才会做一个循环?
============
'判断ip.txt最后一次访问时间到现在是不是过了24小时

GetText File, "test", Null

这个模块,如果ip.txt超过24小时后续操作是什么???没代码

加个Q可以吗,有利调试和反溃信息更快传达给你
作者: batman    时间: 2013-9-6 09:43

加批处理群找我吧,群号43011867
作者: batman    时间: 2013-9-6 13:12

本帖最后由 batman 于 2013-9-6 19:53 编辑

应该可以结帖了。。。
  1. '初始化全局变量
  2. Dim AdslName, AdslUser, AdslPassword, Ip, File, Text, Times
  3. AdslName = "XXXX"
  4. AdslUser = "XXXX"
  5. AdslPassword = "XXXXXX"
  6. Ip = "www.baidu.com"
  7. File = "ip.txt"
  8. '输入断网时间
  9. Do Until Times <> 0
  10.   Times = Int(InputBox("请输入自动断网重连的时间,单位为分钟,默认为10分钟",,10))
  11. Loop
  12. '判断ip.txt最后一次访问时间到现在是不是过了24小时
  13. GetText File, "test", Null
  14. '每Times分钟断网重连循环
  15. Do
  16.   Again
  17.   WScript.Sleep Times * 60 * 1000
  18. Loop
  19. Function Again
  20.   '拔号循环
  21.   Dim OK
  22.   OK = vbNullString
  23.   Do Until OK = "ok"
  24.     Adsl "disconnect"
  25.     WScript.Sleep 1000
  26.     Adsl "connect"
  27.     WScript.Sleep 1000
  28.     Juge
  29.     If Juge = 0 Then
  30.       GetIp : Text = vbNullString
  31.       GetText File, "read", Null
  32.       If InStr(Text, GetIp) = 0 Then
  33.         GetText File, "write", GetIp
  34.         OK = "ok"
  35.       End If
  36.      End If
  37.   Loop
  38. End Function
  39. Function Juge
  40.   '判断网络通畅
  41.   Juge = 1
  42.   Dim objWMI, objItems, objItem
  43.   Set objWMI = GetObject("Winmgmts:")
  44.   Set objItems = objWMI.ExecQuery _
  45.     ("Select * From Win32_PingStatus " _
  46.       & "Where Address = '" & Ip & "'")
  47.   For Each objItem In objItems
  48.     If objItem.ResponseTime > 0 Then Juge = 0
  49.   Next
  50.   Set objItems = Nothing
  51.   Set objWMI = Nothing
  52. End Function
  53. Function Adsl(Types)
  54.   'ADSL拔号版块
  55.   Dim objSHELL
  56.   Set objSHELL = CreateObject("Wscript.Shell")
  57.   If Types = "connect" Then
  58.     objSHELL.Run "rasdial.exe " & AdslName _
  59.       & " " & AdslUser & " " & Adslpassword, 0, 0
  60.     Else
  61.     objSHELL.Run "rasdial.exe /disconnect", 0, 0
  62.   End If
  63.   Set objSHELL = Nothing
  64. End Function
  65. Function GetIp
  66.   '获取外网IP
  67.   Dim objWMI, objItems, objItem
  68.   Set objWMI = GetObject("Winmgmts:")
  69.   Set objItems = objWMI.ExecQuery _
  70.     ("Select * From Win32_NetworkAdapterConfiguration " _
  71.       & "Where IPEnabled = True")
  72.   For Each objItem In objItems
  73.     For Each address In objItem.IPAddress
  74.       If address <> "" And InStr(objItem.Caption, "WAN 微型端口") _
  75.         Then GetIp = address
  76.     Next
  77.   Next
  78. End Function
  79. Function GetText(File, Types, GetIp)
  80.   '文本读、写版块
  81.   Dim objFSO
  82.   Set objFSO = CreateObject("Scripting.FileSystemObject")
  83.   If Not objFSO.FileExists(File) Then _
  84.     objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  85.   If Types = "read" Then
  86.     Text = objFSO.OpenTextFile(File).ReadAll
  87.     Else
  88.     If Types = "write" Then
  89.       objFSO.OpenTextFile(File, 8).WriteLine GetIp
  90.       Else
  91.       oldday = objFSO.GetFile(File).DateLastModified
  92.       If DateDiff("h", oldday, Now) > 24 Then _
  93.         objFSO.OpenTextFile(File, 2, True).WriteLine "IP列表"
  94.      End If
  95.   End If
  96.   Set objFSO = Nothing
  97. End Function
复制代码

作者: samiking    时间: 2013-9-6 22:35

谢谢版主,不怨其烦的修改代码.学到好多东西,谢谢
作者: batman    时间: 2013-9-7 00:58

这个是批处理版的:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "name=xxxx"
  3. set "user=xxxx"
  4. set "password=xxxxxx"
  5. set /a times=10
  6. echo,&set /p times=    请输入自动断网重连的时间,单位分钟,默认为10分钟:
  7. cls&set /a s=times*60
  8. if not exist ip.txt echo,IP列表>ip.txt
  9. for %%a in (ip.txt) do (
  10.   for /f %%b in ("%%~ta") do (
  11.     if "%%b" neq "%date:~,10%" echo,IP列表>ip.txt
  12.   )
  13. )
  14. :lp
  15. echo,&echo,    网络连接中,请稍等。。。
  16. rasdial /disconnect>nul 2>nul
  17. call :delay 2
  18. rasdial %name% %user% %password%>nul 2>nul
  19. call :delay 2
  20. ping /n 1 www.baidu.com>nul||goto lp
  21. cls&echo,&echo,    网络成功连接。。。
  22. call :delay 2
  23. set "ip="&set "flag="
  24. for /f "delims=" %%a in ('ipconfig') do (
  25.   set "str=%%a"
  26.   if not defined ip (
  27.     if defined flag (
  28.       if "!str:IP Address=!" neq "!str!" (
  29.         set "ip=!str:*:=!"
  30.         set "ip=!ip:~1!"
  31.       )
  32.     )
  33.     if "!str:~,3!" equ "PPP" set "flag=a"
  34.   )
  35. )
  36. findstr "%ip%" ip.txt>nul&&goto lp||echo,%ip%>>ip.txt
  37. cls&echo,&echo,    网络保持中。。。
  38. call :delay %s%
  39. goto lp
  40. :delay
  41. mshta "javascript:document.write();setTimeout('close()',%1*1000)"
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2