获取服务状态的Windows命令是什么?

27
我需要知道批处理脚本结束时服务的状态,该脚本使用“net stop thingie”和“net start thingie”重新启动服务。
在我最理想的世界里,我希望将状态通过电子邮件发送给自己,在寒冷的冬夜阅读,以确保我知道服务器正常运行,为自己带来温暖和舒适。
只是想让你知道,我正在使用Windows Server 2003平台,批处理文件似乎是最好的选择。如果有其他建议,我也不介意尝试,但就知识而言(就像僵尸渴望大脑一样,我想,为什么不学点东西呢),是否有一个命令可以在命令行中检查服务的状态?
我应该将命令输出重定向到文件中吗?
然后我的裤子在哪里?(天啊,我真的希望这里插入的幽默不会冒犯任何人。今天早上,我也需要幽默感:P)
[编辑:]我使用的解决方案(不再)可以从 - 链接已删除 - 下载。
它被设置为每晚执行的任务,并在早晨检查我的电子邮件,看服务是否已正确重新启动。
12个回答

32

你尝试过使用 sc.exe 吗?

C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4  RUNNING

C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1  STOPPED

请注意,在批处理文件中,你需要将每个百分号都加倍。


或者更简单(但类似):for /f "tokens=4" %a in ('sc query YOURSERVICENAME ^| findstr STATE') do echo %a - Jesper Mygind

21
您可以在您的服务上调用net start "服务名称"。如果它还没有启动,它将启动并返回错误级别=0,如果它已经启动,则返回错误级别=2。

不确定为什么我在这个问题上被踩了,但既然他正在使用批处理文件通过net start命令启动服务,并且内置了返回错误代码的命令,最简单的方法就是检查错误代码。但如果必须创建一个单独的vbs来代替检查返回值,那我也无所谓。 - JRL

12

使用pstools,尤其是psservice和“query”命令,例如:

psservice query "serviceName"

这是我的最爱 ^^ - Nam G VU

10

也可以看这里:

NET START | FIND "服务名" > nul IF errorlevel 1 ECHO 服务未运行

刚刚复制自: http://ss64.com/nt/sc.html


对于“NET START”,没有明显的方法来获取正在运行的服务列表。 - Fr0sT

9
如果您可以使用PowerShell...
(如果您需要更具体的翻译,请提供更多上下文)
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}

我会为您提供...

Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov

如果您只需要检查一个服务,可以将****Network****替换为特定的服务名称。


7

使用 Windows 脚本:

Set ComputerObj = GetObject("WinNT://MYCOMPUTER")    
ComputerObj.Filter = Array("Service")    
For Each Service in ComputerObj    
    WScript.Echo "Service display name = " & Service.DisplayName    
    WScript.Echo "Service account name = " & Service.ServiceAccountName    
    WScript.Echo "Service executable   = " & Service.Path    
    WScript.Echo "Current status       = " & Service.Status    
Next

您可以轻松地针对您想要的特定服务进行筛选。

2
选择它是因为无需安装。谢谢大家! - Olivier Tremblay

3
我的意图是创建一个脚本,可以在同一个脚本中切换服务的开启和关闭。
net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

...

非常有帮助!非常感谢z666。

但是当例如服务被禁用(也是错误级别=2?)时,它会进入“AlreadyRuning”,永远不会到达。

if errorlevel 1 goto Error  ?!!

i wanted an output for that case ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

我的看法,希望这能帮到你


3

我看到"Nick Kavadias"提到:

"根据这个http://www.computerhope.com/nethlp.htm,应该使用NET START /LIST ..."

如果你在Windows XP中输入以下内容:

NET START /LIST

如果出现错误,只需键入即可。

NET START

/LIST 只适用于 Windows 2000... 如果您仔细阅读此网页,您会发现 /LIST 仅适用于 Windows 2000 部分。
希望这可以帮到您!

2
也许这是启动服务并检查结果的最佳方式。
当然,可以在类似于File.BAT的批处理文件中放置像下面这个示例一样的内容,只需将“NameOfService”替换为所需的服务名称,并用自己的代码替换REM行:
@ECHO OFF

REM Put whatever your Batch may do before trying to start the service

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

REM Put Whatever you want in case Service was not running and start correctly

GOTO ContinueWithBatch

:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch

:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch

:ContinueWithBatch

REM Put whatever else your Batch may do

另一个需要注意的是,在不改变其状态的情况下检查它的状态,这时有一种更简单的方法,只需运行:

net start

因此,如果没有参数,它将显示所有已启动服务的列表...

所以,在管道中进行简单的grep或find操作即可...

当然,从File.BAT文件内部放置像这个例子一样的内容,只需用所需的服务名称替换"NameOfSercive"并用自己的代码替换REM行:

@ECHO OFF

REM Put here any code to be run before check for Service

SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning

REM Put here any code to be run if Service Is Running

GOTO ContinueWithBatch

:ServiceIsNotRunning

REM Put here any code to be run if Service Is Not Running

GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Service

希望这可以帮助!这是我通常使用的东西。

所有与临时文件相关的东西都可以用 (NET START | FIND "NameOfService" > nul) && SET ServiceRunning=1GOTO 替代设置标志。 - Fr0sT

1

嗯,我不确定你是否可以从批处理文件中通过电子邮件发送结果。如果我可以提出一个替代建议来解决您的问题,那就是使用VBScript。我并不擅长VBScript,但您可以使用它来查询本地机器上运行的服务。下面的脚本将向您发送在运行该脚本的机器上运行的所有服务的状态。您显然需要替换SMTP服务器和电子邮件地址。如果您是域的一部分,并且以特权用户身份(必须是远程计算机上的管理员)运行此脚本,则可以通过将localhost替换为FQDN来查询远程计算机。

Dim objComputer, objMessage
Dim strEmail

' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next

' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"

'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")

For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next

objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send

希望这对你有所帮助!享受吧!
编辑:哦,还有一件事,服务状态为4表示该服务正在运行,服务状态为1表示它没有运行。我不确定2或3是什么意思,但我愿意打赌它们是停止/启动。

非常感谢您提供的脚本!我将在批处理文件中使用它,以一种简单而高效的方式作为对VB脚本的调用,这在服务器上很容易处理 :P - Olivier Tremblay
结合我选择的另一个脚本作为最佳答案,我成功完成了停止/重新启动/邮件结果循环。 - Olivier Tremblay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接