返回列表 发帖
有没有人帮忙做下,谢谢

TOP

顶下,有没有比较好的解决方法?谢谢

TOP

没时间给你完整代码,wmi 方法参考
自动识别拨号上网还是路由
http://www.bathome.net/thread-3198-1-2.html

TOP

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
LoopCOPY
这是lxzzr版主给出的vbs代码。

不知道与zm900612 版主的bat代码,实现的功能是否一样呢?

TOP

@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);"
)COPY
网络连接正常时“完全没有流量”是不可能的,所以我按大约超过10kb来判断,不过哪怕没有上网,三十分钟的吞吐量也应该超过10kb了吧...

TOP

20# ygqiang


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



多谢。

我的意思是指:过30分钟,如果网络完全没有流量(网络掉线、完全断开,这个时候不能上网)的时候,自动关机。

TOP

20# ygqiang


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

TOP

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")
LoopCOPY
这个是lxzzr版主给出的vbs代码,功能是:如果出现断网就自动关机。

我的要求是:如果断网,等待30分钟左右,如果还不能联网,才关闭xp系统。

TOP

@Echo Off
:Loop
Ping /n 1 www.bathome.net>nul||ShutDown /s /t 1
MsHta JavaScript:document.write();setTimeout('close()',300000);
Goto LoopCOPY
不知道能否结合这个,实现所需要的效果呢?

TOP

本帖最后由 caruko 于 2011-7-7 16:37 编辑

17# zm900612


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

而systeminfo 就没有这个麻烦,因为它的启动时间本身就是时间差,而不是时间点。

TOP

16# caruko


用 wmic os get LastBootUpTime,LocalDateTime 更省事噢~

TOP

用systeminfo为了省去调用%time%的计算麻烦。
倒是没注意过时间是否准确。

其实也就是大概判断,ping -n 3000 时间足够长了,循环不占用什么资源,倒是ping用的多,虽然可以用其它办法解决,比如设置计划任务。
其实就是图懒。

TOP

顶下,期待高手来解决啊。

TOP

13# caruko


systeminfo 太慢了,建议用 wmic os 或者 net user %username%,而且没必要循环获取启动时间吧,那个太耗时了...而且通过启动时间到当前的时差来计算平均速度并非即时的,一旦开机久了就不准了,而且假如在开机之后久不联网,就产生误判了...

TOP

本帖最后由 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
)COPY

TOP

返回列表