代码之家  ›  专栏  ›  技术社区  ›  Burt

如果服务存在条件

  •  10
  • Burt  · 技术社区  · 15 年前

    您将如何检查Win32服务是否存在,如果存在,请执行一些操作?

    6 回复  |  直到 8 年前
        1
  •  12
  •   icabod    15 年前

    在我的头上,您可以使用“net”命令检查特定的服务是否正在运行,如bmargulies所提到的那样,通过管道将结果发送到“find”中。 下面的内容将检查服务是否正在运行,如果正在运行,请停止它。然后,您可以在不担心它是否已经运行的情况下启动它:

    net start | find "SomeService"
    if ERRORLEVEL 1 net stop "SomeService"
    net start "SomeService"
    

    如果您使用findstr进行搜索,正如其他一些答案所建议的那样,那么您将检查错误级别是否等于0(零)…如果是这样,那么您就找到了要查找的字符串:

    net start | findstr "SomeService"
    if ERRORLEVEL 0 net stop "SomeService"
    net start "SomeService"
    

    基本上,大多数DOS命令都会设置错误级别,允许您检查像查找这样的操作是否成功。

        2
  •  18
  •   Joey    10 年前

    在DOS中不能这样做,因为DOS不是Windows,甚至没有“服务”的概念。

    在Windows批处理文件中,可以使用 sc 查找服务的命令:

    sc query | findstr SERVICE_NAME
    

    这将枚举所有服务并生成它们各自的名称。

    您可以使用

    sc query | findstr /C:"SERVICE_NAME: myservice"
    

    请记住,此搜索区分大小写。您可以添加 /I 切换到 findstr 为了避免这种情况。

        3
  •  5
  •   helios456    11 年前

    只是对已接受答案的补充。如果您要做的事情不仅仅是重新启动服务,而是要查看是否安装了服务。

    sc query state= all | findstr /C:"SERVICE_NAME: MyService" 
    if ERRORLEVEL 0 (**My Operation**)
    

    在这种情况下, 状态=全部 很重要,因为如果服务未启动,它将被解释为未安装,这是两个独立的事情。

        4
  •  3
  •   Maxence    9 年前

    我使用下面的代码:

    SC QUERY | FIND "SERVICE_NAME: MyService"
    IF %ERRORLEVEL% EQU 0 NET STOP MyService
    

    如果 我的服务 找不到%errorlevel%将由find设置为1,否则将保持为0。指令if%errorlevel%equ 0允许您测试最后一个案例并继续对您的服务执行操作。

    IF ERRORLEVEL 0 NET STOP MyService
    

    将不起作用,因为它在%ErrorLevel%大于或等于零时执行该命令。

    在Visual Studio后期生成事件中,必须放置:

    EXIT 0
    

    最后,因为vs会检测到%errorlevel%!=0,将认为后期生成事件已失败。小心使用,因为这样会隐藏命令序列中的所有错误。

    使用此技巧,您可以忽略错误并在生成后事件中使用此方法重新启动服务:

    NET STOP MyService
    NET START MyService
    EXIT 0
    
        5
  •  3
  •   user2956477    8 年前

    不应进行成功测试:“如果(不是)错误级别1”??

    在Windows Shell中,“if errorlevel”表示错误级别为或更高,因此“if errorlevel 0”始终为真。

        6
  •  1
  •   Helen    15 年前

    如何使用 WMIC :

    首先列出所有进程,然后将进程名变为grep。如果结果不存在,将不打印任何结果。

    wmic service |findstr "ProcessName"
    

    例子:

    C:\>wmic service |findstr "Search"
    FALSE        TRUE        Windows Search