如何检查服务是否存在,如果存在则执行某些操作?
答案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>
来检查您的服务。如果服务不存在,则会抛出错误。您可以使用 检查错误代码。我在安装脚本中使用类似的东西1060
来if 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
)