如果服务存在条件

你将如何检查一个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