通过批处理或cmd文件停止并启动服务?
我怎么能脚本蝙蝠或CMD停止和启动服务与错误检查可靠(或让我知道这是不成功的,无论什么原因)?
使用SC
(服务控制)命令,它给了你更多的select,而不仅仅是start
和stop
。
描述: 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 start
和net 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 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
和反向工作。
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