';切割';Windows批处理文件的相似功能
我已经有一段时间没有使用Windows批处理文件了,我似乎忘记了一切。我要做的是查找路径有空格但字符串没有引号的服务。男孩,这对bash来说很容易,但是 因此,简而言之,我从';切割';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
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
,等等。