'cut'类似于Windows批处理文件的功能

时间:2013-07-10 21:57:54

标签: windows command-line batch-file cmd

自从我完成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并将THAT转储到临时文件。它最终包含类似的内容(引用是我的保留所有空格):

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

我一直在阅读和谷歌搜索,测试和尝试一切,试图在:结束切割输出,所以我可以结束路径本身,然后开始找出必须憎恶是Windows下的正则表达式。但我不能把那个字符串分开。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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属性,以避免奇怪的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

答案 2 :(得分:0)

这样的东西?

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