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

我怎么能脚本蝙蝠或CMD停止和启动服务与错误检查可靠(或让我知道这是不成功的,无论什么原因)?

使用SC (服务控制)命令,它给了你更多的select,而不仅仅是startstop

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

      选项<server>的格式为“\\ ServerName”
      进一步的命令帮助可以通过input:“sc [command]”来获得
      命令:
        查询-----------查询服务的状态,或
                        枚举服务types的状态。
         queryex ---------查询服务的扩展状态,或者
                        枚举服务types的状态。
        开始-----------开始一项服务。
        暂停-----------向服务发送暂停控制请求。
        询问-----向服务发送一个INTERROGATE控制请求。
        继续--------向服务发送一个CONTINUE控制请求。
        停止------------发送停止请求到服务。
         config ----------更改服务的configuration(持续)。
        描述-----更改服务的描述。
        失败---------更改失败时服务所采取的行动。
         qc --------------查询服务的configuration信息。
         qdescription ----查询服务的描述。
         qfailure --------查询服务失败时所采取的行动。
        删除----------删除一个服务(从registry)。
        创build----------创build一个服务。  (将其添加到registry中)。
        控制---------将控件发送到服务。
         sdshow ----------显示服务的安全描述符。
         sdset -----------设置服务的安全描述符。
         GetDisplayName  - 获取服务的DisplayName。
         GetKeyName ------获取服务的ServiceKeyName。
         EnumDepend ------枚举服务依赖关系。

      以下命令不需要服务名称:
       sc <server> <command> <option>
        开机------------(ok | bad)表示最后一次开机是否应该
                        保存为最后一次已知的启动configuration
        locking------------locking服务数据库
         QueryLock -------查询SCManager数据库的LockStatus
  例:
           sc启动MyService
 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. 

如果从batch file运行,则可以访问返回码的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命令不会返回logging的Win32_Service类的返回码(服务不活动,服务请求超时等),对于许多错误将只返回Errorlevel 2。

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

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

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

免责声明:我从头顶写这篇文章,但我认为它会起作用。

而不是检查代码,这也是有效的

 net start "Apache tomcat" || goto ExitError :End exit 0 :ExitError echo An error has occurred while starting the tomcat services exit 1 

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

语法总是让我….所以…

这里是明确的如何添加一行到一个batch file,如果你是两台机器上的pipe理员,将杀死远程服务(在另一台机器上),以pipe理员身份运行.bat,并且这些机器位于同一个域中。 机器名称遵循UNC格式\ myserver

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

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

对于你的服务行动瘾君子…一定要追加你的理由代码和评论! 即等于“计划”的“4”和评论“停止维护的服务器”

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

我已经创build了我的个人batch file,我有点不同,但可以随意修改,因为你认为合适。 我刚刚创build了这个,因为我很无聊,想要让人们能够input结束,开始,停止或设置为自动的简单方法。 这BAT文件只是要求你input服务名称,它会为你做剩下的。 我没有意识到他正在寻找一些说错误的东西,我一定误解了这个部分。 虽然通常可以通过在行尾input>> output.txt来完成。

%var%只是用户input自己的服务的一种方式,而不是每次想要启动/停止不同的服务时都要修改bat文件。

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

 @echo off set /pc= 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 /pc= 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 /pc= 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 /pc= 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 

我们希望认为“净停”会停止服务。 可悲的是,现实不是那么黑白。 如果服务需要很长时间才能停止,那么该命令将在服务停止之前返回。 你不会知道,但是,除非你检查errorlevel。

解决scheme似乎是循环查找服务的状态,直到停止,每次循环都暂停。

但话又说回来…

我看到第一个服务需要很长时间才能停止,那么后续服务的“净停”看起来什么也不做。 看看服务经理的服务,其状态仍然是“开始” – 不改变“停止”。 然而,我可以使用SCM手动停止第二个服务,并在3或4秒内停止。

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

我刚才使用了Jonas的例子,创build了0到24个错误级别的完整列表。 其他post是正确的, 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和反向工作。

SC可以完成所有的服务…启动,停止,检查,configuration等等…

手动服务重启是可以的 – services.msc有“重启”button,但是在命令行中,sc和net命令都没有“重启”开关,如果在cmd / bat文件中重启,服务会立即停止并立即启动,得到一个错误,因为服务尚未停止,它需要一些时间来closures的东西。

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

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