0

自从我完成 Windows 批处理文件以来已经有一段时间了,我似乎忘记了一切。我想要做的是寻找路径有空格但字符串没有被引用的服务。男孩,使用 bash 会很容易,但是......

因此,简而言之,我首先将其sc query | findstr SERVICE_NAME转储到临时文件中。然后我将它读回一个变量,for /F "tokens=2" %%f in (temp_file) do set services=!services! %%f 这让我得到一个变量,其中包含我主机上所有服务的空格分隔列表。现在,在针对该变量的 FOR 循环中,我运行 sc qc %%s | findstr BINARY_PATH_NAME并将其转储到临时文件中。它最终包含类似的内容(引号是我的以保留所有空格):

"       BINARY_PATH_NAME   : C:\Windows\system32\svchost.exe -k LocalSystemNetworkRestricted"

我一直在阅读、谷歌搜索、测试和尝试一切,试图最终削减输出,:这样我就可以结束路径本身,然后开始找出在 Windows 下必须是正则表达式的可恶。但我就是无法拆分字符串。

4

3 回答 3

2

如果您想要所有服务的二进制路径,您可以执行以下操作:

for /f "tokens=2" %%n in ('sc query ^| findstr SERVICE_NAME') do (
  for /f "delims=: tokens=1*" %%r in (
    'sc qc "%%~n" ^| findstr BINARY_PATH_NAME'
  ) do (
    echo %%~s
  )
)

如果您希望二进制路径带有服务名称,请更改echo %%~s为。echo %%~n:%%~s

于 2013-07-10T22:35:11.133 回答
1

Ansgar Wiechers 有一个很好的解决方案,使用 SC 来获取运行服务的信息。它还演示了如何使用 FOR /F delims 选项在:.

另一种选择是使用 WMIC 以更直接的方式获取相同的信息。

如果您想要的只是所有活动(运行)服务的二进制路径列表,那么您只需要:

wmic service where "state='Running'" get pathname

如果您想要服务名称列表以及二进制路径:

wmic service where "state='Running'" get name, pathname

还有更多可以列出的属性。在命令提示符下键入wmic service get /?以获取完整列表。

如果您想在批处理过程中将值放入变量中以便您可以采取行动,则使用 FOR /F 循环。我在末尾附加了 state 属性,以避免在<CR>WMIC 输出的每一行末尾附加一个不需要的 FOR /F 怪癖。不需要的<CR>将附加到我们不关心的状态值。我还使用带有 FINDSTR 的状态来清除不需要的行,因此不需要 WMIC WHERE 子句。在这个例子中,我只是简单地回显这些值,但显然你可以对它们做任何需要的事情。

for /f "tokens=2,3 delims=," %%A in (
  '"wmic service get name, pathname, state /format:csv|findstr /e Running"'
) do echo %%A: %%B
于 2013-07-11T00:49:45.467 回答
0

像这样的东西?

@echo off
for /f "tokens=2 delims=: " %%a in ('sc query ^| findstr SERVICE_NAME') do (
   sc qc %%a | findstr BINARY_PATH_NAME
)
pause
于 2013-07-10T22:30:16.217 回答