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


288

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


也许有些偏离主题(因为您要求bat&cmd指令),但是:PowerShell为执行此类操作提供了很多控制和反馈。
GvS

Answers:


347

使用SC(服务控制)命令,它为您提供的不仅仅是start&的更多选项stop

  描述:
          SC是一个命令行程序,用于与
          NT服务控制器和服务。
  用法:
      sc <服务器> [命令] [服务名称] ...

      选项<server>的格式为“ \\ ServerName”
      可以通过键入以下命令获得有关命令的更多帮助:“ sc [command]”
      命令:
        query -----------查询服务状态,或
                        枚举服务类型的状态。
        queryex --------查询服务的扩展状态,或者
                        枚举服务类型的状态。
        start -----------启动服务。
        暂停-----------将暂停控制请求发送到服务。
        询问-将INTERROGATE控制请求发送到服务。
        继续--------将CONTINUE控制请求发送到服务。
        stop ------------将STOP请求发送到服务。
        config ----------更改服务的配置(持久)。
        description -----更改服务的描述。
        故障---------更改服务在故障时采取的措施。
        qc --------------查询服务的配置信息。
        qdescription ----查询服务的描述。
        qfailure --------查询服务在失败时采取的措施。
        delete ----------删除服务(从注册表中)。
        create ----------创建服务。(将其添加到注册表)。
        control ---------将控件发送到服务。
        sdshow ----------显示服务的安全描述符。
        sdset -----------设置服务的安全描述符。
        GetDisplayName-获取服务的DisplayName。
        GetKeyName ------获取服务的ServiceKeyName。
        EnumDepend ------枚举服务依赖项。

      以下命令不需要服务名称:
      sc <服务器> <命令> <选项>
        boot ------------(确定|错误)指示是否应该最后一次启动
                        保存为最新的良好启动配置
        锁定------------锁定服务数据库
        QueryLock ------查询SCManager数据库的LockStatus
  例:
          sc启动MyService

1
我同意这比净启动/停止好。请注意,还有一个选项可以触摸远程计算机上的服务。
Outlaw程序员

1
好答案。但是您需要成为管理员才能运行“ SC启动服务”。我在这里找到了解决方案。(接受的答案包含了解决方案)
Michael K.

56
SC的问题是命令立即返回,而不是在操作完成之后返回。如果要通过批处理文件重新启动服务(先停止再启动),停止将立即返回,由于服务未停止,因此启动失败。操作完成后,净停止/启动返回,因此没有此问题。
Dom 2014年

我以管理员模式打开cmd,但出现错误该命令的语法是:NET STOP服务
Satish Singh

有没有办法检查服务是否正常停止?在2020年?
飞利浦

212
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表示成功。更高的值表示失败。

作为蝙蝠文件,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类返回代码(“服务未激活”,“服务请求超时”等),对于许多错误,仅返回Errorlevel 2。

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


1
NET 只是服务相关的功能,同时SC 只为服务相关的功能。
2012年

3
这个答案更好,因为“ net”命令会阻塞并等待服务启动或停止,然后再继续执行批处理脚本。
史蒂文

由于(如Edit所说)大多数情况下errorlevel返回的是2,请参见此处如何解释错误结果
HeyJude

28

您可以使用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%

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


8

而不是检查代码,这也可以

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

7

我为此创建了个人批处理文件,我的文件有些不同,但是可以根据需要随意修改。我前一阵子创建它的原因是我很无聊,并且想为人们提供一种简单的方式来输入结束,开始,停止或设置为自动。该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

1
通常,不接受仅代码答案。您能否详细说明您的解决方案或添加一些解释性评论?
土蚣

2
我前一阵子创建它的原因是我很无聊,并且想为人们提供一种简单的方式来输入结束,开始,停止或设置为自动。该BAT文件仅要求您输入服务名称,其余的将由您完成。
纳撒尼尔·威尔逊


5

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

如果您同时是两台计算机上的管理员,以管理员身份运行.bat且这些计算机位于同一域中,则这里明确地说明了如何在批处理文件中添加一行以终止远程服务(在另一台计算机上)。机器名称遵循UNC格式\ myserver

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

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

对于您的Service Ops迷...请务必附加您的原因码并添加注释!例如,“ 4”等于“计划中”,并注释“停止服务器进行维护”

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

1
如果我需要使用其他用户名和密码登录怎么办?
Frantumn 2014年

1
然后,您CMD以其他用户/ ID身份运行,runas /user:Domain\UserName cmd然后输入密码。CMD将以指定的用户帐户开始运行。
user4317867 2015年

4

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

解决方案似乎是循环查找服务状态,直到服务停止为止,每次循环都会暂停。

但话又说回来...

我看到第一个服务需要很长时间才能停止,然后后续服务的“净停止”似乎无济于事。在服务管理器中查看该服务,其状态仍为“已启动”-未更改为“停止”。但是,我可以使用SCM手动停止第二项服务,并且它会在3或4秒钟内停止。


3

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


3

我只是在上面使用Jonas的示例,并创建了0到24个错误级别的完整列表。其他职位是正确的,net start并且net 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然后反向进行。


3

可以手动重新启动服务-services.msc具有“重新启动”按钮,但是在命令行中,sc和net命令都缺少“重新启动”开关,如果在cmd / bat文件中计划了重新启动,则服务会立即停止并启动,有时由于服务尚未停止而出现错误,它需要一些时间来关闭系统。

这可能会产生错误:sc stop sc start

插入超时是个好主意,我使用ping(每1秒ping一次):sc停止ping localhost -n 60 sc start


2

这是Windows 10命令,用于使用batch启动系统还原:

sc config swprv start= Auto

您可能还喜欢这些命令:

  • 将注册表值更改为自动启动系统还原

    REG添加“ HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore” / v DisableSR / t REG_DWORD / d 0 / f

  • 创建系统还原点

    Wmic.exe /名称空间:\ root \ default路径SystemRestore调用CreateRestorePoint“ djibe保存了您的PC”,100,12

  • 更改系统还原磁盘使用率

    vssadmin调整影子存储大小/ for = C:/ on = C:/ maxsize = 10%

请享用


1

SC 可以使用服务来做所有事情...启动,停止,检查,配置等...


1

有时您会发现停止操作不起作用。

我的SQlServer有时会这样做。使用以下命令行将其杀死。如果您确实需要脚本杀死不会停止的东西。我会把它作为最后的手段

taskkill /pid [pid number] /f

0

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

只需设置这3个变量

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

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

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

注意:这需要从Visual Studio Developer命令行运行,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%

也许这可以帮助某人:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.