通过批处理或 cmd 文件停止和启动服务?

Posted

技术标签:

【中文标题】通过批处理或 cmd 文件停止和启动服务?【英文标题】:Stop and Start a service via batch or cmd file? 【发布时间】:2010-09-13 03:06:51 【问题描述】:

我如何编写一个 bat 或 cmd 脚本以通过错误检查可靠地停止和启动服务(或让我知道无论出于何种原因它都没有成功)?

【问题讨论】:

可能有点离题(因为您要求使用 bat 和 cmd 指令),但是:PowerShell 为您执行此类操作提供了很多控制和反馈。 【参考方案1】:

使用net startnet stop 的返回码对我来说似乎是最好的方法。试试看这个:Net Start return codes。

【讨论】:

链接页面不再存在。因此,这更像是一条评论。【参考方案2】:
net start [serviceName]

net stop [serviceName]

很清楚地告诉你他们是成功还是失败。例如

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

如果从批处理文件运行,您可以访问返回码的 ERRORLEVEL。 0 表示成功。任何更高的值都表示失败。

作为一个bat文件,error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

输出如下所示:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

返回码

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

编辑 20.04.2015

返回码:

NET 命令不返回记录在案的 Win32_Service 类返回代码(服务未激活、服务请求超时等),并且对于许多错误只会返回错误级别 2。

看这里:http://ss64.com/nt/net_service.html

【讨论】:

NET 仅用于服务相关功能,而SC 仅用于服务相关功能。 这个答案更好,因为“net”命令阻塞并等待服务启动或停止,然后批处理脚本继续执行。 因为(正如编辑所说)大多数时候返回的errorlevel 是 2,see here how to interpret the error result。【参考方案3】:

您可以使用 NET START 命令,然后检查 ERRORLEVEL 环境变量,例如

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

免责声明:我是从头到尾写的,但我认为它会起作用。

【讨论】:

【参考方案4】:

使用SC(服务控制)命令,它为您提供了比startstop 更多的选项。

描述: SC 是一个命令行程序,用于与 NT 服务控制器和服务。 用法: sc [命令] [服务名称] ... 选项 的格式为“\\ServerName” 可以通过键入以下命令获得有关命令的更多帮助:“sc [command]” 命令: query-----------查询服务的状态,或者 枚举服务类型的状态。 queryex---------查询服务的扩展状态,或 枚举服务类型的状态。 start-----------启动服务。 pause-----------向服务发送暂停控制请求。 interrogate-----向服务发送一个 INTERROGATE 控制请求。 continue--------向服务发送CONTINUE控制请求。 stop------------向服务发送 STOP 请求。 config----------更改服务的配置(持久)。 description-----更改服务的描述。 failure---------更改服务在失败时采取的操作。 qc-------------查询服务的配置信息。 qdescription----查询服务的描述。 qfailure--------查询服务失败时的动作。 delete----------删除服务(从注册表中)。 create----------创建服务。 (将其添加到注册表中)。 control---------向服务发送控制。 sdshow----------显示服务的安全描述符。 sdset-----------设置服务的安全描述符。 GetDisplayName--获取服务的 DisplayName。 GetKeyName------获取服务的 ServiceKeyName。 EnumDepend------枚举服务依赖。 以下命令不需要服务名称: sc boot------------(ok | bad) 表示最后一次启动是否应该 保存为最后一次正确的引导配置 Lock------------锁定服务数据库 QueryLock-------查询SCManager数据库的LockStatus 例子: sc 启动我的服务

【讨论】:

我同意这比网络启动/停止更好。请注意,还有一个选项可以在远程机器上触摸服务。 很好的答案。但是您需要成为管理员才能运行“SC 启动服务”。我找到了here 的解决方案。(接受的答案包含解决方案) SC 的问题是命令立即返回,而不是在操作完成后返回。如果您想通过批处理文件重新启动服务(停止然后启动),停止立即返回,然后启动失败,因为服务没有停止。 net stop/start 动作完成后返回,所以不存在这个问题。 我以管理员模式打开cmd,出现错误该命令的语法是:NET STOP service 有没有办法检查服务是否正常停止?? 2020 年?【参考方案5】:

SC 可以用服务做任何事情……启动、停止、检查、配置等等……

【讨论】:

【参考方案6】:

或者您可以使用此 cmd 启动远程服务:sc \\<computer> start <service>

【讨论】:

【参考方案7】:

除了检查代码之外,这也有效

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

【讨论】:

【参考方案8】:

语法总是让我……所以……

如果您是两台机器上的管理员,请以管理员身份运行 .bat,并且机器在同一台上领域。机器名称遵循 UNC 格式 \myserver

sc \\ip.ip.ip.ip stop p4_1

在这种情况下... p4_1 既是服务名称又是显示名称,当您在服务管理器中查看服务的属性时。您必须使用服务名称。

对于您的 Service Ops 爱好者...请务必附加您的原因代码和评论!即 '4' 等于 'Planned' 并注释 'Stopping server for maintenance'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

【讨论】:

如果我需要使用其他用户名和密码登录怎么办? 您通过runas /user:Domain\UserName cmd 以另一个用户/ID 的身份运行CMD,然后输入您的密码。 CMD 将以指定的用户帐户开始运行。【参考方案9】:

我们认为“net stop”会停止服务。可悲的是,现实并非非黑即白。如果服务需要很长时间才能停止,该命令将在服务停止之前返回。但是,除非您检查错误级别,否则您不会知道。

解决方案似乎是循环寻找服务的状态,直到它停止,每次循环都有一个暂停。

不过话说回来……

我看到第一个服务需要很长时间才能停止,然后后续服务的“网络停止”似乎什么都不做。查看服务管理器中的服务,它的状态仍然是“已启动”——没有更改为“正在停止”。但是我可以使用 SCM 手动停止第二个服务,它会在 3 或 4 秒内停止。

【讨论】:

【参考方案10】:

我为此创建了我的个人批处理文件,我的有点不同,但可以随意修改。 不久前我创建了这个,因为我很无聊,想为人们提供一种简单的方法来输入结束、开始、停止或设置为自动。此 BAT 文件仅要求您输入服务名称,其余的工作将由您完成。我没有意识到他正在寻找说明任何错误的东西,我一定是误读了那部分。虽然通常这可以通过在行尾输入 >> output.txt 来完成。

%var% 只是用户能够在其中输入自己的服务的一种方式,而不必每次要启动/停止不同的服务时都去修改 bat 文件。

如果我错了,任何人都可以随时纠正我。

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

【讨论】:

通常,仅代码答案不受欢迎。您能否详细说明您的解决方案或添加一些解释性 cmets? 我不久前创建了这个,因为我很无聊,想为人们提供一种简单的方法来输入结束、开始、停止或设置为自动。此 BAT 文件只要求您输入服务名称,其余的工作都会为您完成。【参考方案11】:

我刚刚使用了上面 Jonas 的示例并创建了 0 到 24 个错误级别的完整列表。其他帖子是正确的,net startnet stop 仅使用 errorlevel 0 表示成功,2 表示失败。

但这对我有用:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

stop 更改为start 并反过来工作。

【讨论】:

【参考方案12】:

手动服务重启没问题 - services.msc 有“重启”按钮,但在命令行中,sc 和 net 命令都缺少“重启”开关,如果在 cmd/bat 文件中安排重启,服务会停止并立即启动,有时它会因为服务尚未停止而出错,需要一些时间才能关闭。

这可能会产生错误: 停止 sc 开始

插入超时是个好主意,我使用 ping(它每 1 秒 ping 一次): 停止 ping 本地主机 -n 60 sc 开始

【讨论】:

【参考方案13】:

有时你会发现停止不起作用..

我的 SQlServer 有时会这样做。使用以下命令行会杀死它。如果你真的需要你的脚本来杀死那些不会停止的东西。作为最后的手段,我会这样做

taskkill /pid [pid number] /f

【讨论】:

【参考方案14】:

我正在用 C# 编写一个 Windows 服务,停止/卸载/构建/安装/启动循环太累了。编写了一个迷你脚本,将其命名为 reploy.bat 并放入我的 Visual Studio 输出目录(具有构建的服务可执行文件的目录)以自动执行循环。

只需设置这 3 个变量

servicename :这显示在 Windows 服务控制面板 (services.msc) 上

slndir:包含您的解决方案 (.sln) 文件的文件夹(不是完整路径)

binpath:构建中的服务可执行文件的完整路径(不是文件夹路径)

注意:这需要从 Visual Studio 开发人员命令行运行,msbuild 命令才能工作。

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

也许这对某人有帮助:)

【讨论】:

为什么总是sc删除?【参考方案15】:

这是使用批处理启动系统还原的 Windows 10 命令:

sc config swprv start= Auto

您可能也喜欢这些命令:

更改注册表值以自动启动系统还原

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" /v DisableSR /t REG_DWORD /d 0 /f

创建系统还原点

Wmic.exe /Namespace:\root\default Path SystemRestore Call CreateRestorePoint "djibe saved your PC", 100, 12

更改系统还原磁盘使用情况

vssadmin 调整 shadowstorage /for=C: /on=C: /maxsize=10%

享受

【讨论】:

【参考方案16】:
    SC NET STOP/START PsService WMIC Powershell 也是easy 用于use 选项

SC 和 NET 已作为 anwests 给出。 PsService 添加了一些简洁的功能,但需要从 Microsoft 下载。

但我最喜欢的方式是使用 WMIC,因为 WQL 语法提供了一种强大的方式来管理一行以上的服务(WMI 对象也可以通过 powershell/vbscript/jscript/c# 使用)。

最简单的使用方法:

wmic service MyService call StartService
wmic service MyService  call StopService

WQL 示例

wmic service where "name like '%%32Time%%' and ErrorControl='Normal'" call StartService

这将启动名称包含32Time 并具有正常错误控制的所有服务。

Here 是您可以使用的方法。

与:

wmic service get /FORMAT:VALUE

您可以查看有关服务的可用信息。

【讨论】:

【参考方案17】:

我没有找到上述任何答案来提供令人满意的解决方案,因此我编写了以下批处理脚本...

:loop
net stop tomcat8 
sc query tomcat8 | find "STOPPED"
if errorlevel 1 (
  timeout 1
  goto loop
)
:loop2
net start tomcat8
sc query tomcat8 | find "RUNNING"
if errorlevel 1 (
  timeout 1
  goto loop2
)

一直运行net stop,直到服务状态为STOPPED,状态停止后才运行net start。如果服务需要很长时间才能停止,net stop 可能会终止失败。如果由于某种原因服务没有成功启动,它会一直尝试启动服务,直到状态为 RUNNING。

【讨论】:

以上是关于通过批处理或 cmd 文件停止和启动服务?的主要内容,如果未能解决你的问题,请参考以下文章

求助,本地计算机上的mysql服务启动后停止

通过命令窗口控制mysql服务的启动与停止

cmd启动和停止tomcat

通过 .bat 在已打开的 CMD 中插入命令

windows系统DOC命令启动或停止服务

描述用命令如何启动,停止,重新启动和查看www服务?