Board logo

标题: 关于时间段控制服务的困惑~~谢谢高手指点 [打印本页]

作者: boyhong     时间: 2007-4-26 21:55    标题: 关于时间段控制服务的困惑~~谢谢高手指点

需求:在电脑一直在开机状态下实现本脚本自动在系统时间8:00-17:00之间运行某个服务,其它时间停止这个服务。
如下是我是本坛学习而弄的第一个小脚本,盼高手指点.



@Echo Off
color 1e
cls
Echo.
Echo                某某服务全自动启停控制.   
Echo --------------------------------------------------------------------

:zidong
@Echo OFF
Set /a thisTime=%Time:~0,2%
If %thisTime% GTR 8 Goto :start
If %thisTime% GTR 17 Goto :stop
Echo Time is between 8:00-17:00
:: 全自动启停某某服务 ...
GOTO :zidong


:start
@echo 正在启动某某服务
net start Messenger
Goto zidong

:stop
@echo 正在停止某某服务
net stop Messenger
Goto zidong

:End
Exit

[ Last edited by boyhong on 2007-4-26 at 08:45 PM ]
作者: boyhong     时间: 2007-4-26 22:00
好像运行不了~~经过我想,对于1:00-9:00,偏移量是2的话一定会错的。但不知怎么解决已便实现我的这个需求~~

盼高手指点一下
作者: flyinspace     时间: 2007-4-26 22:07
使用 AT 或自己建立计划任务咯。。

at 08:00 "net start ***"
at 17:00 "net stop ***"

若是xp。

at 08:00 "sc start ***"
at 17:00 "net stop ***"
作者: boyhong     时间: 2007-4-26 22:20
谢谢楼上的~~呵呵。。在那台电脑上不敢开 AT 服务~~怕怕安全性...呵呵。几乎24小时对公网服务的,操作系统还是个2000呢~~~

谢谢您的回复


要是用计划任务的话。还有一个问题,怎么让这个脚本循环执行呢?

[ Last edited by boyhong on 2007-4-26 at 09:28 AM ]
作者: bjsh     时间: 2007-4-26 22:29
我不大理解你的意思;

你是想让该脚本运行后自动判断时间是否在8点到17点之间来决定是否开启服务啊;
(举例: 现在 9点;运行脚本后;自动开启了服务;(现在18点;如果你不再次双击脚本;服务将继续开着;)
         现在18点;运行脚本后;自动停止了服务;
)

还是想让该脚本运行后;自动判断时间来开启服务;并自动在规定时间之外关掉服务;(而不要用再次双击脚本)

上面的两种不知道你想做哪种
作者: boyhong     时间: 2007-4-26 23:05
还是想让该脚本运行后;自动判断时间来开启服务;并自动在规定时间之外关掉服务;(而不要用再次双击脚本)

而不要再次双击脚本这种会自动的~~~

感谢班班的关注.
作者: bjsh     时间: 2007-4-26 23:41
你的不能用计划任务是吧;
作者: bjsh     时间: 2007-4-26 23:43
不能用做计划任务;
就写个bat;做成自启动系统服务;
时刻监视时间;来确定是否开启或关闭你指定的服务
作者: everest79     时间: 2007-4-27 01:57
if %time% geq 8 (
if %time% lss 17 (
net start service
) else (net stop service)
) else (net stop service)
不过这样可能更简单

set /a a=%time:~0,2%,1/(a/8),1/(16/a)&&net start service||net stop service

[ Last edited by everest79 on 2007-4-26 at 01:02 PM ]
作者: bjsh     时间: 2007-4-27 02:06
to:everest79

他要求 在 不能启用schedule的情况下;

运行脚本后自动在规定时间外停用指定的服务;


也就是说:

  Quote:
set /a at=%time:~0,2%,1/(a/8),1/(16/a)&&net start service||net stop service

如果现在时间13点钟 运行该脚本;
则会启动服务;

如果一直不关机;当到了18:00时;如果不再此双击脚本的话;服务是不会自动停止的;

我觉得倒不如 做个循环 然后做成服务.
作者: everest79     时间: 2007-4-27 02:13
我一直想在计数器或日志服务里找到一个可以触发外部命令的方法,不过还没发现,嘿嘿
作者: boyhong     时间: 2007-4-27 06:52


  Quote:
Originally posted by bjsh at 2007-4-26 01:06 PM:
to:everest79

他要求 在 不能启用schedule的情况下;

运行脚本后自动在规定时间外停用指定的服务;


也就是说:


如果现在时间13点钟 运行该脚本;
...

谢谢各位的关心~~

对的,我的电脑很少关机,充当服务器角色。。。
这种情况下,电脑上有个服务是定时开启定时关闭的。

我想用批处理来实现。可以吗?
作者: boyhong     时间: 2007-4-27 06:56


  Quote:
Originally posted by everest79 at 2007-4-26 12:57 PM:
if %time% geq 8 (
if %time% lss 17 (
net start service
) else (net stop service)
) else (net stop service)
不过这样可能更简单

set /a a=%time:~0,2%,1/(a/8),1/(16/a)&&net sta ...

循环不直去。。。上边这个开了,但就关不了。

每天都有一个特定的时间段开启我的这个服务,8:00-17:00,其它时间这个服务是停止的,但这台电脑是一直开机的24*7小时服务的。。
作者: flyinspace     时间: 2007-4-27 07:53    标题: 直接运行,就不管咯。

@echo off

echo wscript.sleep 60000>delay.vbs

:continue
      set /a at=%time:~0,2%,1/(a/8),1/(16/a)&&net start service||net stop servic
      cscript /nologo delay.vbs
goto :continue
作者: vkill     时间: 2007-4-27 08:00


  Quote:
Originally posted by flyinspace at 2007-4-27 07:53:
@echo off

echo wscript.sleep 60000>delay.vbs

:continue
      set /a at=%time:~0,2%,1/(a/8),1/(16/a)&&net start service||net stop servic
      cscript /nologo delay.vbs
goto :co ...

貌似没有定义a何来1/(a/8) ?
作者: boyhong     时间: 2007-4-27 08:02
楼上的flyinspace大哥。

能不能解答一下:
set /a at=%time:~0,2%,1/(a/8),1/(16/a)&&net start service||net stop
servic
的含义呢。。

那个a,是。。。。我刚拿才试了一下。提示:

以零为除数的错误。

谢谢啦

[ Last edited by boyhong on 2007-4-26 at 07:09 PM ]
作者: bjsh     时间: 2007-4-27 08:11
to:vkill
应该是笔误;
应该是at不是a
作者: bjsh     时间: 2007-4-27 08:14
不知道lz在 8:30 分或者17:30分的时候是想停止服务还是开启服务??

这涉及到数字的问题;

大于等于 17点停止服务还是 大于17点停止;

大于等于8:00开启还是 大于8点开启
作者: boyhong     时间: 2007-4-27 08:17
TO:版主大哥
      保持8:00——17:00这组服务正常运行,其它时间停止这组服务..
但脚本不能关闭,要循环,每天都在自动保持我的这个对这组特定服务的自动启停.

用wscript.sleep来休眠实现循环真是个好主意。

可上下边那个看不太懂。
set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&

[ Last edited by boyhong on 2007-4-26 at 07:29 PM ]
作者: bjsh     时间: 2007-4-27 08:29
用flyinspace的这段代码;其中已经改了;
注意是at而不是a;
而且 他 给的延迟时间也太夸张了
60000秒??16个小时丫;
600秒差不多
注意把自己想要控制的service改好名称

  Quote:
@echo off
echo wscript.sleep 600>delay.vbs
:continue
      set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&net start service||net stop service
      cscript /nologo delay.vbs
goto continue

建议做成系统服务;
避免了这个脚本因为一直开着可能会被人误关;而且一天天的有个窗口开着(即使是最小化)也是不雅观的;
而且下次重启还得双击;
不如做成自启动的系统服务;一切就都不用管了;

[ Last edited by bjsh on 2007-4-26 at 07:35 PM ]
作者: bjsh     时间: 2007-4-27 08:34
set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&net start service||net stop service


这句话的是利用了 set /a的连续赋值特性;

当at在 8:00---17:00之外时;就会造成 除数为零的错误;
errorlevel为9169
因此程序执行||后面的停止服务语句;
当处于这段时间时;结果一般为1;errorlevel为0
于是执行 && 后的开启服务语句;

加上循环和延迟 定时检查时间 判断;就达到了你要的效果;

再说一次;强烈建议做成系统服务;于是就算"完美"了
作者: boyhong     时间: 2007-4-27 08:36
我刚才去看,set /?了~~HELP文件里对这几个符号的解释太粗了点。。。

谢谢~~在班班的帮助下看懂了~~

做成系统服务////不知怎么做。。。再次麻烦班班出手一下~~谢谢啦

现在成如下了。谢谢

@echo off
echo wscript.sleep 600>delay.vbs
:continue
      set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&net start 服务1 net start 服务2 net start 服务3||net stop 服务1 net stop 服务2 net stop 服务3
      cscript /nologo delay.vbs
goto continue

[ Last edited by boyhong on 2007-4-26 at 07:40 PM ]
作者: bjsh     时间: 2007-4-27 08:42
做成系统服务看这里:

http://www.cn-dos.net/forum/view ... ;highlight=runassrv

[ Last edited by bjsh on 2007-4-26 at 07:58 PM ]
作者: bjsh     时间: 2007-4-27 08:44
你上面的代码有错;应该为:

@echo off
echo wscript.sleep 600>delay.vbs
:continue
      set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&(net start 服务1 & net start 服务2 & net start 服务3)||(net stop 服务1 &  net stop 服务2  & net stop 服务3)
      cscript /nologo delay.vbs
goto continue

[ Last edited by bjsh on 2007-4-26 at 08:51 PM ]
作者: boyhong     时间: 2007-4-27 08:59
谢谢~~我弄好了~~

如下:

sc create 服务名 binPath= 路径  [选项1] [选项2]
作者: boyhong     时间: 2007-4-27 09:02
最后关于今天大家对我的帮助,感谢flyinspace大哥的思路,及各位对我的贴子的关注,尤其是bjsh版主手把手~~真诚感谢~~

关于用于实际后的情况,大家得等我用上四五天,然后再回来反馈。

再次感谢。

[ Last edited by boyhong on 2007-4-26 at 08:04 PM ]
作者: bjsh     时间: 2007-4-27 09:07
sc create 似乎对批处理不大支持;
反正在我的机器上是启动不起来;

正在试 runassrv
作者: boyhong     时间: 2007-4-27 09:10
我的电脑是XP2,可以起来。这个脚本最终是用在另一台WIN2000电脑上的。我现在就去看看。。
作者: bjsh     时间: 2007-4-27 09:21
等下吧;
我刚才试了;
很浪费资源的;我服务起来居然占到50%以上;
把那段延迟去掉;基本就不占资源了;

干脆用这个吧;

  Quote:
@echo off
:continue
      set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&(net start 服务1 & net start 服务2 & net start 服务3)||(net stop 服务1 &  net stop 服务2  & net stop 服务3)
      ping -n 60 127.1
goto continue

把他做服务吧;测试不占系统资源;
不过如果去掉了ping -n 60 127.1 占用就几乎100%

[ Last edited by bjsh on 2007-4-26 at 08:45 PM ]
作者: boyhong     时间: 2007-4-27 09:32
~~我正在为占用的CPU发愁~~

用ping -n 60 127.1确实缓解了~~

不过那段代码好像有问题,正在试...

试得差不多了~~
确实有些问题。现在时间:20:31
按照脚本来说,应是关闭服务的,,可是看到执行的情况是:

开启服务然后又关闭服务。然后开始延时,又开始先开服务,再停服务。就这样循环。

[ Last edited by boyhong on 2007-4-26 at 08:49 PM ]
作者: bjsh     时间: 2007-4-27 09:51
是有问题的;如果开启多个服务;应该加括号;
29楼已经改了;
作者: boyhong     时间: 2007-4-27 10:05
现在按照您的意思是:

@echo off
:continue
      set /a at=%time:~0,2%,1/(at/8),1/(16/at)&&(net start 服务1 & net start 服务2 & net start 服务3)||(net stop 服务1 &  net stop 服务2  & net stop 服务3)
      ping -n 300 127.1>nul
goto continue

然后做成服务:

sc create 服务名 binPath= 路径  [选项1] [选项2]

功能上已经OK了~~
在资源占用上,刚才看到sleep.exe也可延时,在试,现在试图寻找一种占得最小的东东~~
试验中....
作者: everest79     时间: 2007-4-27 12:48
用vbscript来延时可以动态计算,这样不是更方便
首先确定两个阀值8&17,然后生成sleep的等待时间为当前时间到阀值的差
作者: bjsh     时间: 2007-4-27 22:23
to everest79:

前面已经用vbscript做过了;

后来做成服务后;太占资源;才淘汰这种方法的;
作者: everest79     时间: 2007-4-28 01:32
光只是宿主挂在后台,只占4M内存
作者: bjsh     时间: 2007-4-28 01:43
我也觉得奇怪;
但是那样运行后;我的cpu就会因为 cscript 彪到 50% 以上;
也不大清楚原因
作者: flyinspace     时间: 2007-4-28 03:15
你把延时开得太快了。

wscript.sleep 6000
在实际测试中,只占用了3秒的时间。

我给的延时,在实际计算中,只有30秒的延时。。

这些都是通过计算了的。。

并不是胡乱给的延时结果。

而且在他的应用中,30秒并没有什么关系。。
就是一分钟也在他的接受范围内。
作者: bjsh     时间: 2007-4-28 05:13
难怪呢;

这样解释就合理了;

不过wscript.sleep不是以秒来计算的吗?'

怎么6000会只占3秒?;
作者: everest79     时间: 2007-4-28 05:14
是以毫秒计算的1/1000秒
作者: flyinspace     时间: 2007-4-28 05:37
嗯。按道理来说是 1/1000的。。

但我通过

:redelay
      echo %time%
      cscript /nologo delay
goto :redelay
最后得出的结果就是一半。。。

我也不知道为什么?
作者: bjsh     时间: 2007-4-28 09:47
好久没用vbs了;
连sleep是毫秒都忘了;
汗...
作者: boyhong     时间: 2007-4-28 20:59
我暂时是这样做的:
写了两个批处理
一个启的。
一个停的。
然后在计划任务里。。

关于用vbscript来延时,正在试,好像不止占内存,CPU也不行,先观望一下。个人正在测试这些

谢谢各位,有更好的方法请UP啦
作者: bjsh     时间: 2007-4-28 22:51
前面已经说了 vbs 延时 造成占内存cpu资源;是因为延时过快;
用先前flyinspace兄给你的数值60000就好了;

如果你打算用了计划任务;还用这么费事啊;早搞定了;连延时都不用;
资源耗费为0;

@echo off
schtasks /create /tn "START" /tr net start service /sc daily /st 08:00:00
schtasks /create /tn "STOP" /tr net stop service /sc daily /st 17:00:00

双击一次搞定..
作者: flyinspace     时间: 2007-4-29 00:25    标题: 给一段 VBS 的脚本。

'************************************************************
' 第一次写 vbs 。写得不好,还请高手指点。。
' 使用时,把StopServerName = 后面的名称替换自己需要的名称就行了。
' 脚本误差 +/- 一分钟。
' 而且也解决了内存占用问题。4M 内存应该影响不大吧?
'************************************************************
Dim NHour,NMin,SleepTime
Dim RunState
strComputer = "."
Const StopServerName = "Dnscache"
Do
        Nhour                = Hour(Now)
        Nmin                = Minute(Now)
        SleepTime        = ( 60 - NMin ) * 60 * 1000
        if Nhour > 8 and Nhour < 17 Then
                RunState = SetServerState(StopServerName,"Running")
        Else
                RunState = SetServerState(StopServerName,"Stopped")
        End If
        ‘WScript.Echo "" & SleepTime
        WScript.Sleep SleepTime
Loop
        Function SetServerState(SName,State)
                Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
                Set colItems = objWMIService.ExecQuery("Select * from Win32_Service",,48)
                For Each Item in colItems
                        If Item.Name = Sname And Item.State = "Running" Then
                                If Item.State <> State Then
                                        Item.StopService()
                                End if
                        ElseIf Item.Name = Sname And Item.State = "Stopped" Then
                                If Item.State <> State Then
                                        Item.StartService()
                                End if
                        End if
                               
                Next
        End Function

[ Last edited by flyinspace on 2007-4-28 at 11:39 AM ]