如何从命令行测试服务是否正在运行

时间:2008-12-09 15:37:38

标签: windows batch-file

我希望能够从Windows批处理文件中查询服务是否正在运行。我知道我可以使用:

  

sc查询“ServiceName”

但是,这会丢弃一些文字。我真正想要的是设置errorlevel环境变量,以便我可以采取行动。

你知道一个简单的方法吗?

更新
谢谢你到目前为止的答案。我担心解析文本的解决方案可能无法在非英语操作系统上运行。有没有人知道解决这个问题的方法,或者我将不得不咬紧牙关并编写一个控制台程序来实现这一目标。

14 个答案:

答案 0 :(得分:70)

sc query "ServiceName" | find "RUNNING"

答案 1 :(得分:16)

让我们回到Windows上批量编程的旧学校

net start | find "Service Name"

这可以在任何地方使用......

答案 2 :(得分:8)

如果您不介意将net命令与grep结合使用,可以使用以下脚本。

@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end

答案 3 :(得分:6)

您可以将wmic与/locale选项

一起使用
call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
    echo Running
) else (
    echo Not running
)

答案 4 :(得分:3)

在这里稍微考虑一下我会建议powershell可能是最新的XP / 2003机器的答案,当然在Vista / 2008和更新(而不是.bat / .cmd) 。任何在他们的背景中都有一些Perl的人都应该很快就能在家中感受到。


$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;

if ($serviceStatus -eq "Running") {
    echo "Service is Running";
}
else {
    #Could be Stopped, Stopping, Paused, or even Starting...
    echo "Service is $serviceStatus";
}

另一种方式,如果您在批处理方面有大量投资,则将PS脚本作为单行运行,返回退出代码。


@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"

ECHO.%ERRORLEVEL%

作为单行代码运行也会绕过默认的PS代码签名策略,但代价是混乱。要将PS命令放在.ps1文件中并像powershell myCode.ps1那样运行,您可能会发现签署PowerShell脚本是必要的,以自动方式运行它们(取决于您的环境)。有关详细信息,请参阅http://www.hanselman.com/blog/SigningPowerShellScripts.aspx

答案 5 :(得分:3)

我会建议 WMIC Service WHERE "Name = 'SericeName'" GET Started

WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId(如果未启动服务,则ProcessId将为零)

您可以根据前者返回“TRUE”还是后者返回非零来设置错误级别

答案 6 :(得分:2)

尝试

sc query state= all 

获取服务列表以及它们是否正在运行。

答案 7 :(得分:2)

sc query "servicename" | findstr STATE

例如:

sc query "wuauserv" | findstr STATE

报告Windows更新服务正在执行的操作,运行/暂停等。
这也适用于Windows 10.稍后再次感谢。

答案 8 :(得分:1)

我发现了这个:

  sc query "ServiceName" | findstr RUNNING  

似乎做了大致正确的事情。但是,我担心这种情况不够普及,无法在非英语操作系统上运行。

答案 9 :(得分:1)

@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro 
goto end

:end

答案 10 :(得分:0)

如果您使用的是Powershell,只需添加到列表中即可。

sc.exe query "ServiceName" | findstr RUNNING

以下命令不起作用,因为sc是Powershell中Set-Content的别名。

sc query "ServiceName" | findstr RUNNING
由于某些我不知道的原因,

find也不适用于Powershell。

sc.exe query "ServiceName" | find RUNNING

答案 11 :(得分:0)

SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end

:end

答案 12 :(得分:0)

Use Cygwin Bash with:

:start
C:\Squid\bin\squid.exe
timeout 1
goto start

(Make sure you have sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!" in your PATH.)

答案 13 :(得分:0)

我注意到在使用基于find / findstr的Answers时没有人提到使用正则表达式。对于类似命名的服务,这可能会有问题。

假设您有两项服务,CDPUserSvcCDPUserSvc_54530

如果您到目前为止使用了大多数基于find / findstr的答案,那么当CDPUserSvc正在运行时,CDPUserSvc_54530次查询会出现误报

/r的{​​{1}}和/c开关可以帮助我们处理该用例,以及指示该行结束的特殊字符findstr

此查询仅验证$服务的运行情况并忽略CDPUserSvc

CDPUserSvc_54530