Board logo

标题: [求助]如何用批处理来开关服务 [打印本页]

作者: rcbblgy     时间: 2007-1-23 07:41    标题: [求助]如何用批处理来开关服务
我知道用sc start/stop 服务名 来开关服务,但是我现在想先判断服务是打开的还是关闭的,要是打开的就关闭服务,要是服务是关闭状态就打开服务,这个怎么来实现?是不是用到query这个参数啊,我刚学批处理,高手们指点一下。

作者: lxmxn     时间: 2007-1-23 07:52

  提示一下:先根据SC QUERY <SERVICENAME>的STATE值来判断,再SC CONFIG <SERVICENAME>配置服务,再来SC START/STOP启动停止服务。

作者: rcbblgy     时间: 2007-1-23 07:55
@echo off
sc query vmauthdservice >query.txt
find "state" query.txt |find "4"
if not errorlevel 4 (sc start vmauthdservice) else(sc stop vmauthdservice)

上面的写法只能开不能关,错在哪里?

作者: rcbblgy     时间: 2007-1-23 07:59
我就是不知道怎么用这个值来判断啊

作者: wiky     时间: 2007-1-23 08:09
怎么做才对?我也想知道 。

作者: lxmxn     时间: 2007-1-23 08:22
  我的系统里面没有你说的 vmauthdservice 服务,这里我以telnet服务为例子吧:

@echo off
for /f "delims=" %%i in ('SC QUERY TLNTSVR^|FIND "STATE"') do (
echo %%i|find /i "RUNNING" && (
sc stop tlntsvr
sc config tlntsvr start= disabled)||(
sc config tlntsvr start= auto
sc start tlntsvr)
)
exit/b

作者: hangyug     时间: 2007-1-23 09:53
请问lxmxn,那些"半个"括号是什么意思?还有一个括号占了一行,又是什么意思?可否讲解一下?括号是不是有特殊的用法?

Last edited by hangyug on 2007-1-22 at 08:54 PM ]

作者: lxmxn     时间: 2007-1-23 11:59

这样发给你看,应该明白了吧?

@echo off
for /f "delims=" %%i in ('SC QUERY TLNTSVR^|FIND "STATE"') do (
echo %%i|find /i "RUNNING" && (
sc stop tlntsvr
sc config tlntsvr start= disabled)||(
sc config tlntsvr start= auto
sc start tlntsvr)
)
exit/b

作者: rcbblgy     时间: 2007-1-23 23:50
非常感谢,这个服务是虚拟机的服务。我平时把它设成手动,用虚拟机的时候再开服务,所以服务启动类型就不设了,全当知识学了吧,呵呵。

不过还有一些地方不太明白啊,比如"delims=" 、%%i、^,我以前只看过一些简单的批处理教程,只介绍了常用的命令,哪里有比较全面的讲解教程,我想学学。

作者: ec2049     时间: 2007-1-24 00:16
lxmxn那个bat的作用:
如果服务已启动就让它停止;
如果服务已停止就让它启动;

是这样吗?

作者: lxmxn     时间: 2007-1-24 01:01

  Re rcbblgy:
  
  到论坛的教学室去看看吧,里面很多教程的,搜索一下就有的。

  Re ec2049:
 
  是这样的。运行批处理就可以改变服务的开启状态了。

作者: jasonwang     时间: 2007-1-24 01:17
2000下没有SC这个命令啊?

作者: lxmxn     时间: 2007-1-24 01:21

  那就没有办法了,可以搜索一下论坛里面关于配置系统服务的三方命令行工具,我记得有一个原创帖的。

作者: jasonwang     时间: 2007-1-24 03:22
@echo off
for /f "delims=" %%i in ('SC QUERY TLNTSVR^|FIND "STATE"') do ( 这句看懂了,根据state来做DO后面的工作)
echo %%i|find /i "RUNNING" && ( 如果是"running"状态, &&是什么呢?
sc stop tlntsvr SC命令停止TELNET服务
sc config tlntsvr start= disabled)||( SC永久配置TELNET为不启用 但||是什么意思呢?
sc config tlntsvr start= auto SC启动TELNET为自动,启动TELNET
sc start tlntsvr)
)
exit/b

作者: zerocq     时间: 2007-1-24 05:50
Originally posted by rcbblgy at 2007-1-23 23:50:
非常感谢,这个服务是虚拟机的服务。我平时把它设成手动,用虚拟机的时候再开服务,所以服务启动类型就不设了,全当知识学了吧,呵呵。

不过 ...


楼主和我一样,呵呵
我喜欢在用vmware才开启那些nat,dhcp服务,所以写了一个脚本检测来开关服务

如果你也是vmware的话很简单,因为这些服务在开启后会在产生进程
像vmnat.exe,只要tasklist|find确认就好了

net start|find也可以啊:D

作者: lxmxn     时间: 2007-1-24 06:42
Originally posted by jasonwang at 2007-1-23 14:22:
@echo off
for /f "delims=" %%i in ('SC QUERY TLNTSVR^|FIND "STATE"') do ( 这句看懂了,根据state来做DO后面的工作)
echo %%i|find /i "RUNNING" ...


  去这个的帖子4楼看看。

作者: agesbgfe     时间: 2007-1-24 10:50
GOGGGGGGGGGGGG

作者: hangyug     时间: 2007-1-24 12:07
RE:jasonwang


&& 意思是 命令执行成功,就会执行其后面的命令
|| 正好与&&相反,意思是命令执行失败,就会执行其后面的命令

作者: jasonwang     时间: 2007-1-24 23:15
谢谢楼上解释,我在03下测试没有成功啊,是不是服务在禁用状态下,此命令无效?

作者: jasonwang     时间: 2007-1-24 23:40
C:\>sc query tlntsvr

SERVICE_NAME: tlntsvr
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

C:\>services.bat
请按任意键继续. . .

C:\>sc query tlntsvr

SERVICE_NAME: tlntsvr
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

C:\>

@echo off
for /f "delims=" %%i in ('sc query tlntsvr^|find "state"') do (
echo %%i|find /i "running" && (
sc stop tlntsvr
sc config tlntsvr start=disabled) || (
sc config tlntsvr start=auto
sc start tlntsvr)
)
pause

作者: bob1989     时间: 2007-1-25 00:09
用net start命令好了`
SC在WIN2000下没有

作者: lxmxn     时间: 2007-1-25 00:41
Originally posted by jasonwang at 2007-1-24 10:40:
C:\>sc query tlntsvr

SERVICE_NAME: tlntsvr
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ...


  你的代码有误,复制我写的代码试试看。

作者: jasonwang     时间: 2007-1-25 02:47
搞定了,在第1个find后面加个/i
start= auto 前面应该有个空格。
呵呵,谢谢所有人