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

我希望能够查询是否从一个Windowsbatch file运行服务。 我知道我可以使用:

sc查询“ServiceName”

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

你知道一个简单的方法,我可以做到这一点?

UPDATE
感谢迄今为止的答案。 我担心parsing文本的解决scheme可能不适用于非英文操作系统。 有没有人知道解决这个问题的办法,还是我不得不硬着头皮写一个控制台程序来解决这个问题。

 sc query "ServiceName" | find "RUNNING" 

让我们回到在Windows上批量编程的老派

 net start | find "Service Name" 

这将在任何地方工作…

如果您不介意将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 

你可以用/ locale选项来使用wmic

 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 ) 

在这里稍微思考一下,我打算build议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% 

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

  sc查询“servicename”|  findstr STATE 

例如:

  sc查询“wuauserv”|  findstr STATE 

报告Windows更新服务正在做什么,运行/暂停等
这也是Windows 10.谢谢我以后。

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

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

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

我发现这个:

  sc query "ServiceName" | findstr RUNNING 

似乎做了大致正确的事情。 但是,我担心这不足以在非英文操作系统上工作。

尝试

 sc query state= all 

查看服务列表以及是否正在运行。

只是添加到列表,如果您使用Powershell。

 sc.exe query "ServiceName" | findstr RUNNING 

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

 sc query "ServiceName" | findstr RUNNING 

find也不能在Powershell上工作,出于某种原因,我不知道。

 sc.exe query "ServiceName" | find RUNNING 
 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 
 @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