';切割';Windows批处理文件的相似功能

';切割';Windows批处理文件的相似功能,windows,command-line,batch-file,cmd,Windows,Command Line,Batch File,Cmd,我已经有一段时间没有使用Windows批处理文件了,我似乎忘记了一切。我要做的是查找路径有空格但字符串没有引号的服务。男孩,这对bash来说很容易,但是 因此,简而言之,我从sc query | findstr SERVICE_NAME开始,并将其转储到临时文件中。然后我将它读回一个变量,该变量带有for/F“tokens=2”%%F in(temp_文件)do set services=!服务!%%f获取一个变量,其中包含主机上所有服务的空格分隔列表。现在,在针对该变量的FOR循环中,我运行s

我已经有一段时间没有使用Windows批处理文件了,我似乎忘记了一切。我要做的是查找路径有空格但字符串没有引号的服务。男孩,这对bash来说很容易,但是

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

我一直在阅读、谷歌搜索、测试和尝试一切,试图在
处剪切输出,这样我就可以只处理路径本身,然后开始找出Windows下最讨厌的正则表达式。但是我就是不能把那个字符串分开。

像这样的东西

@echo off
for /f "tokens=2 delims=: " %%a in ('sc query ^| findstr SERVICE_NAME') do (
   sc qc %%a | findstr BINARY_PATH_NAME
)
pause
像这样的

@echo off
for /f "tokens=2 delims=: " %%a in ('sc query ^| findstr SERVICE_NAME') do (
   sc qc %%a | findstr BINARY_PATH_NAME
)
pause

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

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

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

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

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属性,以避免在WMIC输出的每行末尾附加不需要的
的奇FOR/F怪癖。不需要的
将附加到状态值,我们不关心它。我还使用带有FINDSTR的state删除不需要的行,因此不需要wmicwhere子句。在本例中,我只是简单地回显这些值,但显然您可以对它们执行任何需要的操作

for /f "tokens=2,3 delims=," %%A in (
  '"wmic service get name, pathname, state /format:csv|findstr /e Running"'
) do echo %%A: %%B

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属性,以避免在WMIC输出的每行末尾附加不需要的
的奇FOR/F怪癖。不需要的
将附加到状态值,我们不关心它。我还使用带有FINDSTR的state删除不需要的行,因此不需要wmicwhere子句。在本例中,我只是简单地回显这些值,但显然您可以对它们执行任何需要的操作

for /f "tokens=2,3 delims=," %%A in (
  '"wmic service get name, pathname, state /format:csv|findstr /e Running"'
) do echo %%A: %%B

期望的结果是什么?期望的结果是什么?请注意,
for/f
在有空格的情况下非常糟糕。您可以使用
tokens=2*
来匹配第二个和所有后续标记,但每个标记都被分配了一个新变量;在这种情况下,
%n
%m
等。请注意,
for/f
在有空格的情况下非常糟糕。您可以使用
tokens=2*
来匹配第二个和所有后续标记,但每个标记都被分配了一个新变量;在这种情况下,
%n
%m
,等等。