Windows 如果服务条件存在
您将如何检查WIN32服务是否存在,如果存在,请执行一些操作?在我的脑海中,您可以使用“net”命令检查特定服务是否正在运行,如bmargies所述,并将结果传输到“find”中。 类似下面的内容将检查服务是否正在运行,如果正在运行,则停止它。然后,您可以启动它,而无需担心它是否已在运行:Windows 如果服务条件存在,windows,batch-file,cmd,Windows,Batch File,Cmd,您将如何检查WIN32服务是否存在,如果存在,请执行一些操作?在我的脑海中,您可以使用“net”命令检查特定服务是否正在运行,如bmargies所述,并将结果传输到“find”中。 类似下面的内容将检查服务是否正在运行,如果正在运行,则停止它。然后,您可以启动它,而无需担心它是否已在运行: net start | find "SomeService" if ERRORLEVEL 1 net stop "SomeService" net start "SomeService" 如果您使用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,允许您检查查找是否成功。在DOS中不能这样做,因为DOS不是Windows,甚至没有“服务”的概念 在Windows批处理文件中,您可以使用
sc
命令查找服务:
sc query | findstr SERVICE_NAME
这将枚举所有服务并生成它们各自的名称
您可以使用搜索特定服务
sc query | findstr /C:"SERVICE_NAME: myservice"
请记住,此搜索区分大小写。您可以将/I
开关添加到findstr
以避免出现这种情况。如何使用:
首先列出所有进程,然后grep进程名称。如果结果不存在,则不会打印结果
wmic service |findstr "ProcessName"
例如:
C:\>wmic service |findstr "Search"
FALSE TRUE Windows Search
只是对公认答案的补充。如果您希望执行除重新启动服务以外的其他操作,并且希望查看是否已安装该服务
sc query state= all | findstr /C:"SERVICE_NAME: MyService"
if ERRORLEVEL 0 (**My Operation**)
在这种情况下,state=all很重要,因为如果服务未启动,它将被解释为未安装,这是两个独立的东西。不应进行成功测试:“if(not)errorlevel 1”
在windows shell中,“if errorlevel#”表示errorlevel为#或更高,因此“if errorlevel 0”始终为真 我正在使用下面的代码:
SC QUERY | FIND "SERVICE_NAME: MyService"
IF %ERRORLEVEL% EQU 0 NET STOP MyService
如果未找到MyService,则FIND会将%ERRORLEVEL%设置为1,否则将保持为0。指令IF%ERRORLEVEL%eq 0允许您测试最后一种情况,并在您的服务上继续操作
IF ERRORLEVEL 0 NET STOP MyService
将不起作用,因为如果%ERRORLEVEL%大于或等于零,它将执行该命令
在Visual Studio生成后事件中,必须放置:
EXIT 0
因为VS将检测到%ERRORLEVEL%!=0,它会考虑生成后事件失败。请小心使用,因为这将隐藏命令序列中的所有错误
使用此技巧,您可以忽略该错误,并在生成后事件中使用该错误重新启动服务:
NET STOP MyService
NET START MyService
EXIT 0
虽然使用wmic有一个答案,但您也可以使用命令附带的wql语法:
wmic service where "name like '%%32TimeXXX%%'" get /Format:Value
下面是使用上述查询的整个脚本
@echo off
setlocal
:::::::::::::::::::::::::::::::::::
set "SERVICE_TO_FIND=32Time"
:: you can assign also an argument
rem set set "SERVICE_TO_FIND=%~1"
:::::::::::::::::::::::::::::::::::
set "Name="
for /f "usebackq tokens=* delims=" %%# in (
`wmic service where "name like '%%%SERVICE_TO_FIND%%%'" get Name /Format:Value`
) do (
for /f "tokens=* delims=" %%] in ("%%#") do set "%%]"
)
if not defined Name (
echo service like %SERVICE_TO_FIND% not found
rem exit /b 1
) else (
echo service found [%Name%]
)
endlocal
在什么系统上提供什么服务?请提供更多的上下文。这将是一个本地服务,比如说名为ABC。如果该服务作为visual studio中生成后事件的一部分存在,我需要重新启动该服务。VS生成后事件基本上是批处理/dos(??)命令。@Burt:if语句用什么语言?批处理、vbscript、c#甚至perl?当然,如果您安装wc(gnu32中coreutils的一部分),您将执行c:>wmic服务| findstr“Search”| wc-l,然后编写一些代码获取该数字以确定。这是对“如何测试运行可执行文件是否工作”的回答,但这与查看是否安装或运行服务无关,但是我现在没有写评论的权利。如前所述,这应该是:
if not ERRORLEVEL 1(**我的操作**)