标题: [网络连接] 批处理怎样监控网络流量并自动关机? [打印本页]
作者: ygqiang 时间: 2011-7-6 00:28 标题: 批处理怎样监控网络流量并自动关机?
本帖最后由 ygqiang 于 2011-10-7 00:13 编辑
xp系统下,晚上 用迅雷下载高清视频,一开始有200KB/S的下载速度,有的时候,就突然没有速度了。(是通过web页面拨号上网的,如果断线,会自动重新拨号,这个时候,在30分钟以内,会重新拨号多次)
如果30分钟以后,仍然无法拨号成功(不能上网),就自动关机
2011-9-28最新需求如下:
开机,自动启动并监视迅雷,如果迅雷没有运行,则一直监视
如果迅雷已经运行了,则如果20分钟之内网络流量<20k(还要考虑遇到无法拨号成功的情况),就自动关机。
看33楼代码。
33楼vbs代码出现新问题。
这个vbs代码,正常情况下,如果检测到运行迅雷,在2分钟内,如果流量《20k,才会自动关机。
问题就是:运行迅雷(不下载),即使开qq 看在线视频,还会在2分钟内自动关机。
运行迅雷(不下载),一直开qq 看在线视频,在2分钟内,流量应该》20k,应该不会自动关机啊?
作者: ygqiang 时间: 2011-7-6 09:52
顶下,多谢各位啊。
作者: lxzzr 时间: 2011-7-6 09:59
用批处理来监控迅雷的下载流量恐怕做不到...
作者: Demon 时间: 2011-7-6 11:05
真是无所不能的批处理
作者: CrLf 时间: 2011-7-6 11:18
4# Demon
冷嘲热讽很有意思吗?
作者: Demon 时间: 2011-7-6 11:29
4# Demon
冷嘲热讽很有意思吗?
zm900612 发表于 2011-7-6 11:18
在很多人看来,批处理是无所不能的,所以才会问这种问题
作者: CrLf 时间: 2011-7-6 11:34
6# Demon
哦,那我误会你了...刚刚鸡冻了哈,sorry
确实很多人把批处理的功能无限放大、看得太神秘,不过这也没办法呀,人家就是不会才来求助的嘛,要是对批处理的足够非常透彻,也就基本上能够自给自足了的。
作者: caruko 时间: 2011-7-6 16:15
我记得是可以的,流量虽然监测不出来,但是可以监测到数据量,然后对比时间,可以知道大概速度。
检测数据流量命令: netstat -e
作者: caruko 时间: 2011-7-6 16:17
另外,“性能日志与警报”里面,可以监测“网络速度”,低于一定程度,可以自动执行命令。
作者: CrLf 时间: 2011-7-6 16:30
9# caruko
学习了...
不过 win7 下我一直搞不懂如何在“性能日志与警报”面板中设置触发任务,能否请知情人指点一下呢?
另外是否能够用批处理来操作“性能日志与警报”呢?
作者: caruko 时间: 2011-7-6 17:18
10# zm900612
批处理只能开启&停止 已经存在的“ 性能日志与警报” 项目。
警报默认只会在日志里面写入日志,要执行脚本,需要自己更改。
作者: mstsc 时间: 2011-7-6 21:23
都说的我不懂。最主要是没弄过。要是自己弄过就能明白的多了
作者: caruko 时间: 2011-7-7 08:29
本帖最后由 caruko 于 2011-7-7 08:32 编辑
试试这个脚本吧,主要为了防止数值溢出,所以直接去掉后3位,而不是/1024- @echo off &setlocal ENABLEDELAYEDEXPANSION
- for /f "tokens=2" %%i in ('netstat -e ^|findstr "Bytes"') do (
- set "kb=%%i"
- set "kb=!kb:~0,-3!"
- )
- for /f "tokens=2,4,6,8" %%a in ('systeminfo ^|findstr "启动时间"') do (
- set /a stime=( ( %%a*24 + %%b ) * 60 + %%c ) *60 + %%d
- )
- :loop
- ping -n 3000 127.1>nul
- for /f "tokens=2" %%i in ('netstat -e ^|findstr "Bytes"') do (
- set "newkb=%%i"
- set "newkb=!newkb:~0,-3!"
- )
- for /f "tokens=2,4,6,8" %%a in ('systeminfo ^|findstr "启动时间"') do (
- set /a etime=( ( %%a*24 + %%b ) * 60 + %%c ) *60 + %%d
- )
- set /a ll= ( newkb-kb ) / ( etime - stime )
- if !ll! lss 20 (
- shutdown -s -t 5
- exit
- ) else (
- set /a kb=newkb,stime=etime
- goto :loop
- )
复制代码
作者: CrLf 时间: 2011-7-7 08:47
13# caruko
systeminfo 太慢了,建议用 wmic os 或者 net user %username%,而且没必要循环获取启动时间吧,那个太耗时了...而且通过启动时间到当前的时差来计算平均速度并非即时的,一旦开机久了就不准了,而且假如在开机之后久不联网,就产生误判了...
作者: ygqiang 时间: 2011-7-7 10:38
顶下,期待高手来解决啊。
作者: caruko 时间: 2011-7-7 11:15
用systeminfo为了省去调用%time%的计算麻烦。
倒是没注意过时间是否准确。
其实也就是大概判断,ping -n 3000 时间足够长了,循环不占用什么资源,倒是ping用的多,虽然可以用其它办法解决,比如设置计划任务。
其实就是图懒。
作者: CrLf 时间: 2011-7-7 11:27
16# caruko
用 wmic os get LastBootUpTime,LocalDateTime 更省事噢~
作者: caruko 时间: 2011-7-7 16:32
本帖最后由 caruko 于 2011-7-7 16:37 编辑
17# zm900612
WMIC的试了一下,都是准确的时间点。
如果要计算 时间差,可能需要 跨小时来计算,但最麻烦的是跨日期、跨月、甚至跨年。
比如 6月31晚上 挂机下载,那么时间到 7月1日后,计算就复杂多了。
而systeminfo 就没有这个麻烦,因为它的启动时间本身就是时间差,而不是时间点。
作者: ygqiang 时间: 2011-7-8 06:14
- @Echo Off
- :Loop
- Ping /n 1 www.bathome.net>nul||ShutDown /s /t 1
- MsHta JavaScript:document.write();setTimeout('close()',300000);
- Goto Loop
复制代码
不知道能否结合这个,实现所需要的效果呢?
作者: ygqiang 时间: 2011-7-9 07:59
- Dim WSH, WMI, EVN
- Set WSH = CreateObject("Wscript.Shell")
- Set WMI = GetObject("winmgmts:\\.\root\wmi")
- Set EVN = WMI.ExecNotificationQuery("Select * from MSNdis_StatusMediaDisconnect")
- Do While True
- Set LatestEvent = EVN.NextEvent
- WSH.Run("shutdown -s -t 0")
- Loop
复制代码
这个是lxzzr版主给出的vbs代码,功能是:如果出现断网就自动关机。
我的要求是:如果断网,等待30分钟左右,如果还不能联网,才关闭xp系统。
作者: CrLf 时间: 2011-7-9 09:03
20# ygqiang
ping 不通时关机和当流量低于指定值时关机是完全不同的两个方向,你到底想要什么效果呢?求助时请先说明白自己需要的是什么,而不是让别人去猜测、判断
作者: ygqiang 时间: 2011-7-9 09:07
20# ygqiang
ping 不通时关机和当流量低于指定值时关机是完全不同的两个方向,你到底想要什么效果呢?求助时请先说明白自己需要的是什么,而不是让别人去猜测、判断
zm900612 发表于 2011-7-9 09:03
多谢。
我的意思是指:过30分钟,如果网络完全没有流量(网络掉线、完全断开,这个时候不能上网)的时候,自动关机。
作者: CrLf 时间: 2011-7-9 16:13
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in () do (
- set new=
- for /f "skip=4 tokens=2" %%a in ('netstat -e') do if not defined new set new=%%a
- set /a new=!new:~,-4!,in=new-last,last=new,"t=in/10+^!^!in"
- if !in!==10 shutdown /f /s /t 0
- mshta "javascript:document.write();setTimeout('close()',180000);"
- )
复制代码
网络连接正常时“完全没有流量”是不可能的,所以我按大约超过10kb来判断,不过哪怕没有上网,三十分钟的吞吐量也应该超过10kb了吧...
作者: ygqiang 时间: 2011-7-9 19:01
- Dim WSH, WMI, CIM, EVD
- Set WSH = CreateObject("Wscript.Shell")
- Set WMI = GetObject("winmgmts:\\.\root\wmi")
- Set CIM = GetObject("winmgmts:\\.\root\cimv2")
- Set EVD = WMI.ExecNotificationQuery("Select * from MSNdis_StatusMediaDisconnect")
- Do While True
- Set LatestEvent = EVD.NextEvent
- Wscript.Echo "网络已经断开."
- WScript.Sleep 1800000
-
- Set Pings = CIM.ExecQuery("Select * From Win32_PingStatus where Address = 'www.baidu.com'")
- For Each Ping in Pings
- If Ping.StatusCode = 0 Then
- Wscript.Echo "网络已经连接."
- Else
- WScript.Echo "关闭系统"
- Wscript.Echo WSH.Run("shutdown -s -t 6000")
- End If
- Next
- Loop
复制代码
这是lxzzr版主给出的vbs代码。
不知道与zm900612 版主的bat代码,实现的功能是否一样呢?
作者: fastslz 时间: 2011-7-9 19:15
没时间给你完整代码,wmi 方法参考
自动识别拨号上网还是路由
http://www.bathome.net/thread-3198-1-2.html
作者: ygqiang 时间: 2011-9-25 16:49
顶下,有没有比较好的解决方法?谢谢
作者: ygqiang 时间: 2011-9-27 16:34
有没有人帮忙做下,谢谢
作者: lxzzr 时间: 2011-9-27 16:46
- StrComputer = "."
- ConnectionID = "本地连接1"
- '这里根据实际情况修改
-
- Set ObjectWSH = CreateObject("Wscript.Shell")
- Set ObjectWMI = Getobject("winmgmts:\\" & StrComputer)
-
- Set NetCards = ObjectWMI.ExecQuery("Select * from Win32_NetworkAdapter WHERE NetConnectionID='" & ConnectionID & "'")
- If NetCards.count<>0 Then
- For Each NetCard In NetCards
- WScript.Echo "Name: " & NetCard.Name & " MACAddress: " & NetCard.MACAddress
- NetCardName = NetCard.Name
- Next
- Else
- Wscript.Echo "网卡不存在."
- WScript.Quit(0)
- End If
- '获取用于上网的网卡信息
-
- CurrentFlow
- BeginFlow = CurrentFlow
- '获取开始时接收的流量(字节)
- Wscript.Echo "BeginFlow: " & BeginFlow
-
- WScript.Sleep 18000
- '定义时间范围
-
- CurrentFlow
- EndFlow = CurrentFlow
- '获取结束时接收的流量(字节)
- Wscript.Echo "EndFlow: " & EndFlow
-
- Result = EndFlow-BeginFlow
- If Result<10240 Then
- '10240即10KB,当18000秒(上面的时间范围)内接收流量小于10KB就关闭系统
- WScript.Echo "关闭系统."
- ObjectWSH.Run"shutdown.exe -s -t 0", 0, TRUE
- End If
- '计算结果并比较
-
- WScript.Echo "Exit..."
- WScript.Sleep 10000
-
-
- Function CurrentFlow
- Set ObjectFlows = ObjectWMI.InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface")
- For Each ObjectFlow In ObjectFlows
- If ObjectFlow.Name=NetCardName Then
- CurrentFlow = ObjectFlow.BytesReceivedPersec
- End If
- Next
- End Function
复制代码
作者: ygqiang 时间: 2011-9-28 15:07
- On Error Resume Next
- Public CurrentFlowInt
- StrComputer = "."
- ConnectionID = "本地连接"
- '这里根据实际情况修改
-
-
- Set objWMIService = GetObject("winmgmts:" _
- & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
- Set colMonitoredProcesses = objWMIService. _
- ExecNotificationQuery("select * from __instancecreationevent " _
- & " within 1 where TargetInstance isa 'Win32_Process'")
- i = 0
- Do While i = 0
- Set objLatestProcess = colMonitoredProcesses.NextEvent
- If objLatestProcess.TargetInstance.Name = "Thunder.exe" Then
- Wscript.Echo "迅雷已运行."
-
- Set ObjectWSH = CreateObject("Wscript.Shell")
- Set ObjectWMI = Getobject("winmgmts:\\" & StrComputer)
-
- Set NetCards = ObjectWMI.ExecQuery("Select * from Win32_NetworkAdapter WHERE NetConnectionID='" & ConnectionID & "'")
- If NetCards.count<>0 Then
- For Each NetCard In NetCards
- WScript.Echo "Name: " & NetCard.Name & " MACAddress: " & NetCard.MACAddress
- NetCardName = NetCard.Name
- strNet = Split(NetCard.Name, " ", -1, 1)
- str1 = strNet(0) & strNet(1) & strNet(2)
- Next
- Else
- Wscript.Echo "网卡不存在."
- WScript.Quit(0)
- End If
- '获取用于上网的网卡信息
-
- CurrentFlow
- BeginFlow = CurrentFlowInt
- '获取开始时接收的流量(字节)
- Wscript.Echo "BeginFlow: " & BeginFlow
-
- WScript.Sleep 120000
- '定义时间范围
-
- CurrentFlow
- EndFlow = CurrentFlowInt
- '获取结束时接收的流量(字节)
- Wscript.Echo "EndFlow: " & EndFlow
-
- Result = EndFlow-BeginFlow
- If Result<10240 Then
- '10240即10KB,当120000毫秒(120秒=2分钟)(上面的时间范围)内接收流量小于10KB就关闭系统
- WScript.Echo "关闭系统."
- ObjectWSH.Run"shutdown.exe -s -t 0", 0, TRUE
- End If
- '计算结果并比较
-
- WScript.Echo "Exit..."
- WScript.Sleep 10000
- WScript.Quit(0)
- End If
- Loop
-
-
- Function CurrentFlow
- Set ObjectFlows = ObjectWMI.InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface")
- For Each ObjectFlow In ObjectFlows
- strNetName = Split(ObjectFlow.Name, " ", -1, 1)
- str2 = strNetName(0) & strNetName(1) & strNetName(2)
- If str1 = str2 Then
- CurrentFlowInt = ObjectFlow.BytesReceivedPersec
- End If
- Next
- End Function
复制代码
这个代码,属于测试代码,时间间隔设置成2分钟,会陆续弹出相关窗口。
遇到的问题是:
xp sp3系统下,
如果vbs代码先启动,再启动迅雷7的话,测试正常(弹出窗口,可以自动关机)。
如果迅雷7先启动,再运行这个vbs代码,测试无反映(不弹出窗口,不自动关机)。
作者: wc726842270 时间: 2011-9-28 22:56
回复 9# caruko
学习了,一会研究一下,真没想到它还有这种作用,当然其它的我也不了解,呵呵
作者: 920168 时间: 2011-9-28 23:13
呵呵,很好,学习了!
作者: ygqiang 时间: 2011-9-29 11:02
顶啊,多谢各位了。
作者: ygqiang 时间: 2011-9-30 13:37
本帖最后由 ygqiang 于 2011-10-6 20:46 编辑
下面是初步测试vbs代码,可以根据需要,修改时间长度、取消弹出窗口代码
但遇到个小问题,见1楼描述。复制代码
作者: ygqiang 时间: 2011-10-7 00:14
有人说:CurrentFlow函数没调用成功 流量统计有问题
xp系统下测试的。
作者: ygqiang 时间: 2011-10-7 02:32
也有人说:是xp系统本身的问题。
作者: broly 时间: 2011-10-7 21:35
试试这样:复制代码
作者: ygqiang 时间: 2011-10-8 09:52
本帖最后由 ygqiang 于 2011-10-8 11:05 编辑
基本确定是xp系统的问题。-
- Set ObjectFlows = objWMIService.InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface")
复制代码
这个vbs代码,在3个ghost xp系统下运行测试。
其中2个xp系统下可以运行。另1个xp系统不能运行。
是哪里出现问题了?
不能运行的xp系统,是不是服务没有开启或者别的原因?
不能运行的xp系统,是不是服务没有开启或者别的原因?
刚刚发现,33楼的代码,在这3个ghost xp版本上,运行都不能达到预期效果。
即使没有开迅雷,还会出现关机的窗口。
作者: broly 时间: 2011-10-8 10:02
回复 37# ygqiang
36楼代码试试看?
作者: ygqiang 时间: 2011-10-8 11:05
36楼代码,也试过了。
不行。
作者: broly 时间: 2011-10-10 19:14
36楼代码,我这里是测试成功了。
你那没成功有没有提示什么?比如 这个提示BeginFlow: 后面有没有数字?
作者: ygqiang 时间: 2011-12-6 18:33
mark......
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |