我正在努力解析SC.EXE命令的输出。我想列出名称中包含“text”的所有服务(活动或非活动)。
以下代码正在寻找事件日志:
FOR /F "usebackq" %%G IN (`"sc query state= all" ^| find "eventlog"`) DO echo [%%G]
如果不是您需要传递给SC命令的state= all
参数,那么它将全部工作,这样您甚至可以获得不活动的服务。
对于一些不那么清楚的原因,SC命令中的参数值需要用空格分隔,这会造成很多混乱。
非常感谢任何帮助!
答案 0 :(得分:2)
for /f "tokens=2 delims=:" %%s in ('sc query state^= all ^| findstr /i /B /R "SERVICE_NAME:.*event" ') do echo %%s
使用冒号作为分隔符,并在行首处过滤SERVICE_NAME文本的行,然后过滤包含事件的任何文本,检索第二个标记(冒号后的服务名称)。
答案 1 :(得分:1)
FOR /F %%G IN ('sc query state^= all ^| find /i "eventlog"') DO echo [%%G]
似乎会找到eventlog
,回显“[SERVICE_NAME:]
答案 2 :(得分:0)
要保留第二部分并假定冒号(假定SERVICE_NAME值中没有空格),请使用冒号。
sc query state= all | find "SERVICE_NAME" | find "SQL"
SERVICE_NAME: MSSQLFDLauncher
SERVICE_NAME: MSSQLSERVER
SERVICE_NAME: MSSQLServerOLAPService
SERVICE_NAME: SQLBrowser
SERVICE_NAME: SQLSERVERAGENT
SERVICE_NAME: SQLTELEMETRY
SERVICE_NAME: SQLWriter
使用标记2,这将占用上面的第二部分以及DO和该值的回显。在dos文件中,使用%% A。但是这里将使用%A。如果您有更多的令牌2,3,则可以使用%B。在for身体逃脱中,任何将由dos的初始输入解释的东西。
FOR /F "tokens=2 delims=: " %A IN ('sc query state^= all ^| find "SERVICE_NAME"') DO @echo [%A] | find "SQL"
[MSSQLFDLauncher]
[MSSQLSERVER]
[MSSQLServerOLAPService]
[SQLBrowser]
[SQLSERVERAGENT]
[SQLTELEMETRY]
[SQLWriter]