【问题标题】:Will batch script wait while it is executing NET STOP?批处理脚本在执行 NET STOP 时会等待吗?
【发布时间】:2015-02-03 12:52:11
【问题描述】:

我有一个在服务器上运行并停止服务的批处理脚本。 有时会出现服务无法停止使用 NET STOP 并且需要终止服务的问题。 为了解决这个问题,我添加了一个 IF 语句来终止服务,如果没有停止。

NET STOP "Service"

FOR /F "tokens=3 delims=: " %%H IN ('sc query "Service" ^| findstr "        STATE"') DO (
  IF /I "%%H" EQU "RUNNING" (
   :: Kill the service if it is still running
   Taskkill /F /FI "SERVICES eq Service"
  )
)

我已尝试搜索此内容,但找不到明确的答案。

问题是;是仅在“NET STOP”完成后才运行终止进程,还是开始尝试停止服务并立即运行 IF 语句。

如果是后者,我需要在两者之间添加一个 timeout.exe 行,以便给 NET STOP 足够的时间来完成它的工作。

感谢您的帮助。

【问题讨论】:

  • 我相信答案是肯定的 NET STOP 会等待。 SC 不会并且倾向于返回 Pending 状态。

标签: batch-file batch-processing


【解决方案1】:

NET STOP 是同步的。这意味着脚本将等待它完成。此外,您甚至不需要使用SC 检查服务。 NET STOP 有以下返回码:

  • 0 = 成功
  • 1 = 不支持
  • 2 = 访问被拒绝
  • 3 = 相关服务正在运行
  • 4 = 服务控制无效
  • 5 = 服务无法接受控制
  • 6 = 服务未激活
  • 7 = 服务请求超时
  • 8 = 未知故障
  • 9 = 未找到路径
  • 10 = 服务已在运行
  • 11 = 服务数据库已锁定
  • 12 = 已删除服务依赖项
  • 13 = 服务依赖失败
  • 14 = 服务已禁用
  • 15 = 服务登录失败
  • 16 = 服务标记为删除
  • 17 = 服务无线程
  • 18 = 状态循环依赖
  • 19 = 状态重复名称
  • 20 = 状态无效名称
  • 21 = 状态参数无效
  • 22 = 状态无效的服务帐户
  • 23 = 状态服务存在
  • 24 = 服务已暂停

所以您可以检查返回码是否为 0(%ERRORLEVEL%==0 - 表示服务已停止),否则将其终止。

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 2017-11-22
    • 2017-06-11
    • 1970-01-01
    • 2021-06-08
    • 2010-10-18
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多