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

[网络连接] 批处理怎样监控网络流量并自动关机?

[复制链接]
发表于 2011-7-7 11:15:50 | 显示全部楼层
用systeminfo为了省去调用%time%的计算麻烦。
倒是没注意过时间是否准确。

其实也就是大概判断,ping -n 3000 时间足够长了,循环不占用什么资源,倒是ping用的多,虽然可以用其它办法解决,比如设置计划任务。
其实就是图懒。
发表于 2011-7-7 11:27:01 | 显示全部楼层
16# caruko


用 wmic os get LastBootUpTime,LocalDateTime 更省事噢~
发表于 2011-7-7 16:32:17 | 显示全部楼层
本帖最后由 caruko 于 2011-7-7 16:37 编辑

17# zm900612


WMIC的试了一下,都是准确的时间点。
如果要计算 时间差,可能需要 跨小时来计算,但最麻烦的是跨日期、跨月、甚至跨年。
比如 6月31晚上 挂机下载,那么时间到 7月1日后,计算就复杂多了。

而systeminfo 就没有这个麻烦,因为它的启动时间本身就是时间差,而不是时间点。
 楼主| 发表于 2011-7-8 06:14:33 | 显示全部楼层


  1. @Echo Off
  2. :Loop
  3. Ping /n 1 www.bathome.net>nul||ShutDown /s /t 1
  4. MsHta JavaScript:document.write();setTimeout('close()',300000);
  5. Goto Loop

复制代码
不知道能否结合这个,实现所需要的效果呢?
 楼主| 发表于 2011-7-9 07:59:10 | 显示全部楼层
  1. Dim WSH, WMI, EVN
  2. Set WSH = CreateObject("Wscript.Shell")
  3. Set WMI = GetObject("winmgmts:\\.\root\wmi")
  4. Set EVN = WMI.ExecNotificationQuery("Select * from MSNdis_StatusMediaDisconnect")
  5. Do While True
  6.         Set LatestEvent = EVN.NextEvent
  7.         WSH.Run("shutdown -s -t 0")
  8. Loop
复制代码
这个是lxzzr版主给出的vbs代码,功能是:如果出现断网就自动关机。

我的要求是:如果断网,等待30分钟左右,如果还不能联网,才关闭xp系统。
发表于 2011-7-9 09:03:34 | 显示全部楼层
20# ygqiang


ping 不通时关机和当流量低于指定值时关机是完全不同的两个方向,你到底想要什么效果呢?求助时请先说明白自己需要的是什么,而不是让别人去猜测、判断
 楼主| 发表于 2011-7-9 09:07:20 | 显示全部楼层
20# ygqiang


ping 不通时关机和当流量低于指定值时关机是完全不同的两个方向,你到底想要什么效果呢?求助时请先说明白自己需要的是什么,而不是让别人去猜测、判断
zm900612 发表于 2011-7-9 09:03



多谢。

我的意思是指:过30分钟,如果网络完全没有流量(网络掉线、完全断开,这个时候不能上网)的时候,自动关机。
发表于 2011-7-9 16:13:41 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in () do (
  3.         set new=
  4.         for /f "skip=4 tokens=2" %%a in ('netstat -e') do if not defined new set new=%%a
  5.         set /a new=!new:~,-4!,in=new-last,last=new,"t=in/10+^!^!in"
  6.         if !in!==10 shutdown /f /s /t 0
  7.         mshta "javascript:document.write();setTimeout('close()',180000);"
  8. )
复制代码
网络连接正常时“完全没有流量”是不可能的,所以我按大约超过10kb来判断,不过哪怕没有上网,三十分钟的吞吐量也应该超过10kb了吧...
 楼主| 发表于 2011-7-9 19:01:52 | 显示全部楼层
  1. Dim WSH, WMI, CIM, EVD
  2. Set WSH = CreateObject("Wscript.Shell")
  3. Set WMI = GetObject("winmgmts:\\.\root\wmi")
  4. Set CIM = GetObject("winmgmts:\\.\root\cimv2")
  5. Set EVD = WMI.ExecNotificationQuery("Select * from MSNdis_StatusMediaDisconnect")
  6. Do While True
  7.     Set LatestEvent = EVD.NextEvent
  8.     Wscript.Echo "网络已经断开."
  9.         WScript.Sleep 1800000

  10.         Set Pings = CIM.ExecQuery("Select * From Win32_PingStatus where Address = 'www.baidu.com'")
  11.         For Each Ping in Pings
  12.                 If Ping.StatusCode = 0 Then
  13.                         Wscript.Echo "网络已经连接."
  14.                 Else
  15.                         WScript.Echo "关闭系统"
  16.                         Wscript.Echo WSH.Run("shutdown -s -t 6000")
  17.                 End If
  18.         Next
  19. Loop
复制代码
这是lxzzr版主给出的vbs代码。

不知道与zm900612 版主的bat代码,实现的功能是否一样呢?
发表于 2011-7-9 19:15:50 | 显示全部楼层
没时间给你完整代码,wmi 方法参考
自动识别拨号上网还是路由
http://www.bathome.net/thread-3198-1-2.html
 楼主| 发表于 2011-9-25 16:49:29 | 显示全部楼层
顶下,有没有比较好的解决方法?谢谢
 楼主| 发表于 2011-9-27 16:34:47 | 显示全部楼层
有没有人帮忙做下,谢谢
发表于 2011-9-27 16:46:14 | 显示全部楼层

  1. StrComputer = "."
  2. ConnectionID = "本地连接1"
  3. '这里根据实际情况修改

  4. Set ObjectWSH = CreateObject("Wscript.Shell")
  5. Set ObjectWMI = Getobject("winmgmts:\" & StrComputer)

  6. Set NetCards = ObjectWMI.ExecQuery("Select * from Win32_NetworkAdapter WHERE NetConnectionID='" & ConnectionID & "'")
  7. If NetCards.count<>0 Then
  8.         For Each NetCard In NetCards
  9.                 WScript.Echo "Name: " & NetCard.Name & "        MACAddress: " & NetCard.MACAddress
  10.                 NetCardName = NetCard.Name
  11.         Next
  12.         Else
  13.         Wscript.Echo "网卡不存在."
  14.         WScript.Quit(0)
  15. End If
  16. '获取用于上网的网卡信息

  17. CurrentFlow
  18. BeginFlow = CurrentFlow
  19. '获取开始时接收的流量(字节)
  20. Wscript.Echo "BeginFlow: " & BeginFlow

  21. WScript.Sleep 18000
  22. '定义时间范围

  23. CurrentFlow
  24. EndFlow = CurrentFlow
  25. '获取结束时接收的流量(字节)
  26. Wscript.Echo "EndFlow: " & EndFlow

  27. Result = EndFlow-BeginFlow
  28. If Result<10240 Then
  29.         '10240即10KB,当18000秒(上面的时间范围)内接收流量小于10KB就关闭系统
  30.         WScript.Echo "关闭系统."
  31.         ObjectWSH.Run"shutdown.exe -s -t 0", 0, TRUE
  32. End If
  33. '计算结果并比较

  34. WScript.Echo "Exit..."
  35. WScript.Sleep 10000


  36. Function CurrentFlow
  37.         Set ObjectFlows = ObjectWMI.InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface")
  38.         For Each ObjectFlow In ObjectFlows
  39.                 If ObjectFlow.Name=NetCardName Then
  40.                         CurrentFlow = ObjectFlow.BytesReceivedPersec
  41.                 End If
  42.         Next
  43. End Function
复制代码
 楼主| 发表于 2011-9-28 15:07:17 | 显示全部楼层


  1. On Error Resume Next
  2. Public CurrentFlowInt
  3. StrComputer = "."
  4. ConnectionID = "本地连接"
  5. '这里根据实际情况修改


  6. Set objWMIService = GetObject("winmgmts:" _
  7.     & "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2")
  8. Set colMonitoredProcesses = objWMIService. _        
  9.     ExecNotificationQuery("select * from __instancecreationevent " _
  10.         & " within 1 where TargetInstance isa 'Win32_Process'")
  11. i = 0
  12. Do While i = 0
  13.     Set objLatestProcess = colMonitoredProcesses.NextEvent
  14.     If objLatestProcess.TargetInstance.Name = "Thunder.exe" Then
  15.                 Wscript.Echo "迅雷已运行."
  16.        
  17.                 Set ObjectWSH = CreateObject("Wscript.Shell")
  18.                 Set ObjectWMI = Getobject("winmgmts:\" & StrComputer)

  19.                 Set NetCards = ObjectWMI.ExecQuery("Select * from Win32_NetworkAdapter WHERE NetConnectionID='" & ConnectionID & "'")
  20.                 If NetCards.count<>0 Then
  21.                         For Each NetCard In NetCards
  22.                                 WScript.Echo "Name: " & NetCard.Name & "        MACAddress: " & NetCard.MACAddress
  23.                                 NetCardName = NetCard.Name
  24.                                 strNet = Split(NetCard.Name, " ", -1, 1)
  25.                                 str1 = strNet(0) & strNet(1) & strNet(2)
  26.                         Next
  27.                         Else
  28.                         Wscript.Echo "网卡不存在."
  29.                         WScript.Quit(0)
  30.                 End If
  31.                 '获取用于上网的网卡信息

  32.                 CurrentFlow
  33.                 BeginFlow = CurrentFlowInt
  34.                 '获取开始时接收的流量(字节)
  35.                 Wscript.Echo "BeginFlow: " & BeginFlow

  36.                 WScript.Sleep 120000
  37.                 '定义时间范围

  38.                 CurrentFlow
  39.                 EndFlow = CurrentFlowInt
  40.                 '获取结束时接收的流量(字节)
  41.                 Wscript.Echo "EndFlow: " & EndFlow

  42.                 Result = EndFlow-BeginFlow
  43.                 If Result<10240 Then
  44.                         '10240即10KB,当120000毫秒(120秒=2分钟)(上面的时间范围)内接收流量小于10KB就关闭系统
  45.                         WScript.Echo "关闭系统."
  46.                         ObjectWSH.Run"shutdown.exe -s -t 0", 0, TRUE
  47.                 End If
  48.                 '计算结果并比较

  49.                 WScript.Echo "Exit..."
  50.                 WScript.Sleep 10000
  51.                 WScript.Quit(0)
  52.         End If
  53. Loop


  54. Function CurrentFlow
  55.         Set ObjectFlows = ObjectWMI.InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface")
  56.         For Each ObjectFlow In ObjectFlows
  57.                 strNetName = Split(ObjectFlow.Name, " ", -1, 1)
  58.                 str2 = strNetName(0) & strNetName(1) & strNetName(2)
  59.                 If str1 = str2 Then
  60.                         CurrentFlowInt = ObjectFlow.BytesReceivedPersec
  61.                 End If
  62.         Next
  63. End Function


复制代码
这个代码,属于测试代码,时间间隔设置成2分钟,会陆续弹出相关窗口。

遇到的问题是:

xp sp3系统下,

如果vbs代码先启动,再启动迅雷7的话,测试正常(弹出窗口,可以自动关机)。

如果迅雷7先启动,再运行这个vbs代码,测试无反映(不弹出窗口,不自动关机)。
发表于 2011-9-28 22:56:22 | 显示全部楼层
回复 9# caruko


    学习了,一会研究一下,真没想到它还有这种作用,当然其它的我也不了解,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 12:45 , Processed in 0.021905 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表