2013-07-10 106 views
0

我已经完成了Windows批处理文件,这已经有一段时间了,我似乎已经忘记了一切。我想要做的是寻找服务,路径中有空格但字符串未被引用。男孩,这将是容易与bash,但...Windows批处理文件'cut'like feature

所以,简而言之,我从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并将THAT转储到临时文件。它卷起含有类似的信息(引号是我保留所有的空格):

​​

我一直在阅读和谷歌搜索和测试乱投医,尝试拉闸切断该输出在:这样我就可以只要结束这条路径,然后开始搞清楚在Windows下必须是正则表达式的憎恶。但我无法获得该字符串拆分。

+0

期望的结果是什么? – Endoro

回答

0

像这样的东西?如果你想与服务的名称前缀二进制路径

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 %%~secho %%~n:%%~s

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

,如果你想为大家服务的二进制文件路径,您可以执行以下操作。

+0

请注意,“for/f”在存在空格时很糟糕。你可以使用'tokens = 2 *'来匹配第二个和所有后续的标记,但是每个标记都被分配一个新的变量;在这种情况下'%n','%m'等 –

1

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

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

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

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

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

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

有迹象表明,可以列出很多属性。从命令提示符键入wmic service get /?以获取完整列表。

如果您想要在批处理过程中将值存入变量以便您可以采取措施,则使用FOR/F循环。我在最后添加了状态属性以避免奇怪的FOR/F怪异错误,它会将不需要的<CR>附加到WMIC输出的每行末尾。不需要的<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