如果服务存在条件

如果服务存在条件

如何检查服务是否存在,如果存在则执行某些操作?

答案1

sc命令允许您查询 Windows 服务,可以找到该服务的完整详细信息这里

因此,您可以查询特定服务,如果它存在,您将获得如下详细信息:

sc query lanmanserver结果是

SERVICE_NAME: lanmanserver
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE,PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

查询不存在的服务会导致:

[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

The specified service does not exist as an installed service.

因此,您可以编写一个脚本来检查响应,然后根据响应执行您想要的任何操作。

如果你不习惯使用批处理脚本,你也可以在 Powershell 中编写一些更好的脚本,例如

function serviceCheck ($service, $machine) {

$result = [System.ServiceProcess.ServiceController]::GetServices($machine) | where{     (($_.name -eq $service) -or ($_.displayname -eq $service))
}

    if (result -eq $null)
    {
        Do something if service does not exist
    }
    else
    {
        Do something if service does exist
    }
}

答案2

经过一番谷歌搜索后,这里有一个小的 vb 代码片段,用于测试服务是否存在并执行启动方法。

Dim colServices As Object
Dim objService As Object
Set colServices = GetObject("winmgmts:").ExecQuery _
    ("Select Name from Win32_Service where Name = '" & PutServiceNameHere& "'")
For Each objService In colServices
    If Len(objService.Name) Then
        objService.StartService()
    End If
Next
Set colServices = Nothing

希望这可以帮助。

答案3

如果您需要纯批处理,您可以使用sc query <service_name>来检查您的服务。如果服务不存在,则会抛出错误。您可以使用 检查错误代码。我在安装脚本中使用类似的东西1060if errorlevel 1060检查另一个依赖项服务。

REM throw output away with > nul
sc query MyServer > nul
IF ERRORLEVEL 1060 (
    echo "Service is not installed"
) else (
    rem do something else
)

相关内容