22

操作系统:Windows XP、Windows 7 64 位。

我们有一些相当庞大的 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 似乎不允许使用窗口标题进行过滤。

4

5 回答 5

36

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

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

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

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

于 2012-07-31T18:55:09.363 回答
4

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

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

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

于 2019-01-23T19:09:36.250 回答
3

是的,如果 是在搜索的进程名称的末尾,它可以正常工作,正如Fiver*所指出的那样。 以下是有关如何运行命令的示例:

tasklist /FI "IMAGENAME eq no*"
于 2020-11-21T17:40:26.737 回答
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
)

注意过滤器中的星号。

于 2018-01-03T23:01:36.193 回答
0

使用电源外壳。获取进程。如果你能处理这种力量,那就更有用了。尝试

get-process | where MainWindowTitle -like "*UniqueIdentifier*" | select *
于 2021-03-23T03:04:56.730 回答