tasklist.exe中的过滤器不带通配符?

问题描述 投票:15回答:3

AS:Ondoos PC,Ondoos 7 64bit。

我们有一些相当庞大的cmd脚本,用于一些日常构建过程。这些脚本产生了许多其他(窗口化)进程。有一个控制cmd脚本,一个小的简单脚本,它启动主cmd脚本。小控制脚本的目的是在主脚本或其任何子节点失败的情况下进行清理。这很容易实现:主脚本及其所有子代都有窗口标题,以唯一标识符开头。当控制脚本确定主脚本及其所有子节点应该已完成时,它使用任务列表来查找任何挂起进程的窗口,通过:

tasklist.exe / FI“WINDOWTITLE eq UniqueIdentifier *”

这在XP中都非常好用。现在输入Windows7 64位。这里,如果主.cmd脚本或任何其他.cmd shell窗口尝试通过它设置其窗口标题

title UniqueIdentifier Followed By Descriptive Text

Windows7 64位请将其他文本添加到标题中(具体来说,“管理员:”或类似名称)。不能依赖前置文本。所以现在我们想用

tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier*"

但是这个失败并显示错误消息“无法识别搜索过滤器”。使用我们的UniqueIdentifier作为后期修复的路线不起作用:命令

tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier"

也导致相同的错误消息。似乎微软在过滤器中使用“通配符”的概念并不仅限于使用“*”作为终端字符。哎哟。

任何人都有工作吗? Pslist似乎不允许使用窗口标题进行过滤。

filter cmd windows-7 windows-8 tasklist
3个回答
27
投票

您可以使用/ V选项在输出中包含窗口标题,然后将结果传递给FIND(或FINDSTR)以过滤结果。

tasklist /v | find "UniqueIdentifier"
tasklist /v | findstr /c:"UniqueIdentifier"

如果使用FINDSTR,那么我建议使用/ C选项,以便您可以在搜索字符串中包含空格。

如果需要进行不区分大小写的搜索,可能需要使用/I选项。


2
投票

根据我的实验,taskkill的通配符似乎只在字符串的末尾起作用,而不是在任何其他位置。我无法以这种方式找到Microsoft的任何文档。但是,文档中的所有示例都遵循此格式

Successful:  notepad*
Fails: notepad*.exe
Fails *notepad*

正如在另一个答案中所提到的,最好解析tasklist的输出以获得你想要的东西,而不是依赖taskkill的相当破坏的行为。


0
投票

我认为这适用于Windows 10.这是我的代码片段

set PROCNAME="Foobar"
tasklist /FI "IMAGENAME eq %PROCNAME%*" 2>NUL | find /I /N %PROCNAME%>NUL
if "%ERRORLEVEL%"=="0" (
    echo it is running
)

注意过滤器中的星号。

© www.soinside.com 2019 - 2024. All rights reserved.