Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如果服务条件存在_Windows_Batch File_Cmd - Fatal编程技术网

Windows 如果服务条件存在

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

您将如何检查WIN32服务是否存在,如果存在,请执行一些操作?

在我的脑海中,您可以使用“net”命令检查特定服务是否正在运行,如bmargies所述,并将结果传输到“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(**我的操作**)