操作系统: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似乎不允许使用窗口标题进行过滤。
答案 0 :(得分:26)
您可以使用/ V选项在输出中包含窗口标题,然后将结果传递给FIND(或FINDSTR)以过滤结果。
tasklist /v | find "UniqueIdentifier"
tasklist /v | findstr /c:"UniqueIdentifier"
如果使用FINDSTR,我建议使用/ C选项,以便在搜索字符串中包含空格。
如果您需要进行不区分大小写的搜索,可能需要使用/I
选项。
答案 1 :(得分:1)
根据我的实验,taskkill的通配符似乎只在字符串的末尾起作用,而在其他任何位置都不起作用。我找不到来自Microsoft的任何与此相关的文件。但是,文档中的所有示例都遵循这种格式
Successful: notepad*
Fails: notepad*.exe
Fails *notepad*
如另一个答案中所述,最好解析任务列表的输出以准确获得所需的内容,而不要依赖相当残酷的taskkill行为。
答案 2 :(得分: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
)
注意过滤器中的星号。
答案 3 :(得分:0)
是的,如果*
位于要搜索的进程名称的末尾,则可以正常工作,
正如 fiver 指出的那样。
这是有关如何运行命令的示例:
tasklist /FI "IMAGENAME eq no*"
答案 4 :(得分:0)
使用powershell。获取进程。如果你能处理那是更有用的方式。试试
get-process | where MainWindowTitle -like "*UniqueIdentifier*" | select *