如何在批处理中使用SC命令将服务显示名称转换为服务名称?

时间:2013-11-20 01:39:03

标签: windows batch-file

我有两个通过服务监控系统传递的参数。它们是服务显示名称和机器名称。我发现SC命令可以通过GetKeyName检索服务名称。我已经搜索了这个网站和其他人一个星期,当系统被通知服务已关闭时,我一直坚持如何从该数据中提取输出以转换为服务启动命令。

我需要创建批处理/脚本,以便可以接收服务显示名称作为参数,确定服务名称然后发出启动命令。这看起来很简单,但在查看FOR命令时,在查看FOR选项时考虑到未知的令牌数,因为某些服务显示名称有多个空格。

我正在寻找跨越多个Window 2008/2003系统的解决方案,而无需为该服务器上的每个特定服务集编码,或构建一个搜索所有服务的脚本,因为只有一个服务器是塞停止了一个原因,不应该重新启动。这就是为什么我们有一个使用显示名称/服务器名称的中央监控系统。

谢谢,

2 个答案:

答案 0 :(得分:0)

@echo off

    setlocal enableextensions enabledelayedexpansion

    rem Assume that everything will be fine
    set "_exitCode=0"

    rem Retrieve the service display name from parameters to batch file
    rem If it contains spaces, "quote the service name"
    set "_serviceDN=%~1"

    rem Check parameters
    if "%_serviceDN%"=="" (
        echo ERROR: Usage is %~n0 "service display name"
        set "_exitCode=1"
        goto endProcess
    )

    rem Retrieve service name
    set "_serviceName="
    for /F "tokens=1,* delims== " %%a in (' sc GetKeyName "%_serviceDN%" ^| find "=" ') do (
        set "_serviceName=%%b"
    )

    rem Check if we have retrieved the service name. 
    if "%_serviceName%"=="" (
        echo ERROR: Service "%_serviceDN%" not found
        set "_exitCode=2"
        goto endProcess
    )

    rem Get service state
    set "_serviceState="
    for /f "skip=2 tokens=3 delims=: " %%f in ('sc query "%_serviceName%" ^| find ":" ') do (
        if not defined _serviceState set "_serviceState=%%f"
    )

    rem Check if service is stopped and if necessary, start it
    if "%_serviceState%"=="STOPPED" (
        sc start "%_serviceName%" > nul 2>nul 
        set "_exitCode=!errorlevel!"
    )

:endProcess

    rem Clean and return exit code
    endlocal & exit /b %_exitCode%

答案 1 :(得分:-1)

sc //machinename query | findstr DISPLAY_NAME | findstr service.name 

从PowerShell运行