如何在CMD批处理脚本中结合数组使用tasklist命令查询指定进程?
问题根因
你的错误是批处理默认的变量即时展开机制导致的。批处理会在执行FOR循环的代码块之前,提前把所有用%包裹的变量解析完成,此时循环变量%%a还没有被赋值,所以%prog[%%a]%会被解析为无效的空值,传给tasklist的过滤器参数不符合格式,就会抛出「搜索过滤器无法识别」的错误。
解决方案
- 第一步:在脚本开头开启延迟变量扩展,开启后使用
!包裹变量可以让变量在代码执行到对应行时才动态展开 - 第二步:把原来的
%prog[%%a]%替换为!prog[%%a]!,适配延迟展开规则
修正后的完整代码如下:
@echo off :: 开启延迟变量扩展 setlocal enabledelayedexpansion set prog[0]=devcpp.exe set prog[1]=notepad.exe set prog[2]=calc.exe FOR /l %%a IN (0,1,2) DO ( echo 正在查询进程:!prog[%%a]! tasklist /fi "IMAGENAME eq !prog[%%a]!" ) endlocal
如果不需要tasklist默认的表头输出,只想判断进程是否存在,可以调整tasklist行逻辑简化输出:
tasklist /fi "IMAGENAME eq !prog[%%a]!" | findstr /i /c:"!prog[%%a]!" >nul && echo 进程!prog[%%a]!正在运行 || echo 进程!prog[%%a]!未运行
内容的提问来源于stack exchange,提问作者Rafael Réus Mattos
相关产品推荐
相关产品推荐

