如何从命令行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