Filter tasklist.exe中的筛选器不接受通配符?

Filter tasklist.exe中的筛选器不接受通配符?,filter,cmd,windows-7,windows-8,tasklist,Filter,Cmd,Windows 7,Windows 8,Tasklist,操作系统:Windows XP,Windows 7 64位 我们有一些相当强大的cmd脚本,用于一些日常构建过程。这些脚本产生了许多其他(窗口化)进程。有一个控制cmd脚本,一个小的简单脚本,它启动主cmd脚本。小控制脚本的目的是在主脚本或其任何子脚本失败的情况下进行清理。这很容易做到:主脚本及其所有子脚本都有以唯一标识符开头的窗口标题。当控制脚本确定主脚本及其所有子脚本应已完成时,它将使用tasklist通过以下方式查找任何挂起进程的窗口: tasklist.exe/FI“WINDOWTITL

操作系统:Windows XP,Windows 7 64位

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

tasklist.exe/FI“WINDOWTITLE eq UniqueIdentifier*”

这一切在XP中运行得非常好。现在输入Windows7 64位。这里,如果main.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似乎不允许使用窗口标题进行筛选。

您可以使用/V选项将窗口标题包括在输出中,然后通过管道将结果传递到FIND(或FINDSTR)以筛选结果

tasklist /v | find "UniqueIdentifier"
tasklist /v | findstr /c:"UniqueIdentifier"
如果使用FINDSTR,那么我建议使用/C选项,以便在搜索字符串中包含空格


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

我认为这在Windows 10上有效。这是我的片段

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

请注意过滤器中的星号。

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

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

正如在另一个答案中所提到的,最好解析tasklist的输出以获得您想要的结果,而不是依赖taskkill的行为。

是的,如果
*
位于搜索的进程名称的末尾,则可以正常工作, 正如fiver所指出的
以下是有关如何运行该命令的示例:

tasklist /FI "IMAGENAME eq no*"

使用powershell。获取过程。如果你能处理好它的能量,那就更有用了。试一试

get-process | where MainWindowTitle -like "*UniqueIdentifier*" | select *

是的,那会有用的,谢谢(我可能会使用grep而不是find或findstr,这样我就可以使用regexp了)。然而,我没有说的是下一步是使用taskkill来杀死有问题的任务,这里我也有同样的问题。作为一种难看的解决方法,我可以解析来自
tasklist/v | grep…
的输出,然后反馈到taskkill,但这非常难看。我希望有一些未记录的“这是你如何让过滤器正常工作”。唉。不过谢谢,你的想法会奏效的。FINDSTR对regex的支持有限,但grep更强大、更可靠。大家都同意。奇怪的是,在这种情况下,grep将找到“行”,但似乎删除了行的大部分开头,这使得它变得无用,因此findstr胜出。我想知道任务列表是不是把一些奇怪的字符放在中间????(顺便说一句,在我之前的评论中,“如何让过滤器工作”是指任务列表中的/FI过滤-使用grep或findstr进行过滤是微不足道的。)丢弃信息的不是“grep”。任务列表向stderr输出奇数字符。管道2>nul如
(任务列表-v2>nul)| grep…
工作正常。感谢wmz在另一个问题上的观察。