我有两个通过服务监控系统传递的参数。它们是服务显示名称和机器名称。我发现SC命令可以通过GetKeyName检索服务名称。我已经搜索了这个网站和其他人一个星期,当系统被通知服务已关闭时,我一直坚持如何从该数据中提取输出以转换为服务启动命令。
我需要创建批处理/脚本,以便可以接收服务显示名称作为参数,确定服务名称然后发出启动命令。这看起来很简单,但在查看FOR命令时,在查看FOR选项时考虑到未知的令牌数,因为某些服务显示名称有多个空格。
我正在寻找跨越多个Window 2008/2003系统的解决方案,而无需为该服务器上的每个特定服务集编码,或构建一个搜索所有服务的脚本,因为只有一个服务器是塞停止了一个原因,不应该重新启动。这就是为什么我们有一个使用显示名称/服务器名称的中央监控系统。
谢谢,
答案 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运行