我希望能够从Windows批处理文件中查询服务是否正在运行。我知道我可以使用:
sc查询“ServiceName”
但是,这会丢弃一些文字。我真正想要的是设置errorlevel
环境变量,以便我可以采取行动。
你知道一个简单的方法吗?
更新
谢谢你到目前为止的答案。我担心解析文本的解决方案可能无法在非英语操作系统上运行。有没有人知道解决这个问题的方法,或者我将不得不咬紧牙关并编写一个控制台程序来实现这一目标。
答案 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时没有人提到使用正则表达式。对于类似命名的服务,这可能会有问题。
假设您有两项服务,CDPUserSvc
和CDPUserSvc_54530
如果您到目前为止使用了大多数基于find
/ findstr
的答案,那么当CDPUserSvc
正在运行时,CDPUserSvc_54530
次查询会出现误报
/r
的{{1}}和/c
开关可以帮助我们处理该用例,以及指示该行结束的特殊字符findstr
此查询仅验证$
服务的运行情况并忽略CDPUserSvc
CDPUserSvc_54530