你将如何检查一个WIN32服务是否存在,如果是的话,做一些操作?
在我的头顶上,可以使用“net”命令检查一个特定的服务是否正在运行,如bmargulies所述,将结果输入“find”。 像下面的东西会检查一个服务是否正在运行,如果是这样,就停下来。 然后,您可以启动它,而不必担心它是否已经运行。
net start | find "SomeService" if ERRORLEVEL 1 net stop "SomeService" net start "SomeService"
如果你正在使用findstr进行搜索,就像其他一些答案所建议的一样,那么你将检查ERRORLEVEL等于0(零)…如果是,那么你已经找到了你正在寻找的字符串:
net start | findstr "SomeService" if ERRORLEVEL 0 net stop "SomeService" net start "SomeService"
基本上大多数的DOS命令都会设置ERRORLEVEL,允许你检查find是否成功。
你不能在DOS下这样做,因为DOS不是Windows,甚至没有“服务”的概念。
在Windows批处理文件中,您可以使用sc
命令查找服务:
sc query | findstr SERVICE_NAME
这将枚举所有服务并产生它们各自的名字。
您可以使用搜索特定的服务
sc query | findstr /C:"SERVICE_NAME: myservice"
请记住,这个搜索区分大小写。 您可以将/I
开关添加到findstr
以避免这种情况。
只是接受答案的附录。 如果您正在寻找除了重新启动服务之外的其他事情,并且正在查看服务是否已安装。
sc query state= all | findstr /C:"SERVICE_NAME: MyService" if ERRORLEVEL 0 (**My Operation**)
在这种情况下, state = all很重要,因为如果服务没有启动,它将被解释为未安装,这是两个单独的事情。
不应该被成功测试:“if(not)errorlevel 1”?
在windows shell中“如果errorlevel#”意味着错误级别是#或更高,所以“如果错误级别0”一直是真的。
我使用下面的代码:
SC QUERY | FIND "SERVICE_NAME: MyService" IF %ERRORLEVEL% EQU 0 NET STOP MyService
如果未找到MyService ,则%ERRORLEVEL%将被设置为1,否则它将保持为0.指令IF%ERRORLEVEL%EQU 0允许您测试最后一种情况并继续对您的服务进行操作。
IF ERRORLEVEL 0 NET STOP MyService
将不起作用,因为如果%ERRORLEVEL%大于或等于零,它将执行命令。
在Visual Studio后期构建事件中,您必须将一个:
EXIT 0
在最后,因为VS会检测到%ERRORLEVEL%!= 0,它会认为后创建事件失败。 小心使用它,因为这会隐藏命令序列中的所有错误。
有了这个技巧,你可以忽略这个错误,并在你的后期构建事件中使用它来重新启动你的服务:
NET STOP MyService NET START MyService EXIT 0
如何使用WMIC
:
首先列出所有进程,然后grep你的进程名称。 如果不存在,则不会打印结果。
wmic service |findstr "ProcessName"
例:
C:\>wmic service |findstr "Search" FALSE TRUE Windows Search