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

Sco*_*ham 51 windows batch-file

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

sc查询"ServiceName"

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

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

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

Iga*_*ban 75

sc query "ServiceName" | find "RUNNING"
Run Code Online (Sandbox Code Playgroud)

  • 发现不起作用.findstr工作. (3认同)
  • `sc.exe查询"ServiceName"| findstr RUNNING`将在Powershell中运行. (3认同)
  • 如果任务是在服务未运行的情况下启动它,那么测试 `STOPPED` 状态要安全得多,因为该服务也可能处于过渡状态 `STARTING` 和 `STOPPING` 之一,当它处于最好别管。 (2认同)

小智 16

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

net start | find "Service Name"
Run Code Online (Sandbox Code Playgroud)

这将适用于所有地方......


小智 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
Run Code Online (Sandbox Code Playgroud)

  • 我使用过这样的东西,但是使用'find'而不是'grep',因为我不想依赖于安装其他任何东西. (3认同)
  • 我的系统上似乎没有grep。您是否从某个地方下载了它(如果是的话)? (2认同)
  • @ alpha_989否。如果您使用的是Windows,请启动命令提示符并键入“查找/?”。看到它的帮助。 (2认同)

Nic*_*icJ 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
)
Run Code Online (Sandbox Code Playgroud)


小智 5

在这里稍微跳出思维定势,我将建议 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";
}
Run Code Online (Sandbox Code Playgroud)

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


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

ECHO.%ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

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


小智 5

@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
Run Code Online (Sandbox Code Playgroud)