0

现在,我正在编写一个批处理文件,其中有一行用于识别进程列表中是否正在运行进程。

我指的那一行:

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound 

EXE 预先定义为 EXE= My Process Here.exe

我的批处理文件适用于正常进程,但正如您在 My Process Here.exe 中看到的那样,My and Process 和 Here.exe 之间有一个空格,这是无法识别的。

有没有什么办法解决这一问题?我正在寻找的进程有空格,我无法更改进程名称,因为如果我这样做,与之相关的程序将不会运行。

谢谢。

4

3 回答 3

0
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "exe=My Process Here.exe"

    set "processFound="
    for /f "tokens=5 delims=," %%a in ('
        tasklist /fi "imagename eq %exe%" /fo:csv /nh
    ') do set "processFound=1"

    if defined processFound (
        echo %exe% is running
    ) else (
        echo %exe% is NOT running
    )

tasklist检索指定图像名称和 csv 格式的进程列表,不带标题。

有两种选择:进程未运行,然后输出中没有 csv 记录,或者进程正在运行,并且输出中有 csv 记录。

for命令将尝试tasklist使用逗号作为分隔符来标记输出并检索行中的第 5 个标记。

如果输出tasklist是 csv 记录,则此标记将存在,可替换参数将获取数据并do执行子句中的代码。如果输出不是csv记录,则token不存在,do子句中的代码不会被执行。

于 2014-10-23T06:18:36.333 回答
0
@ECHO OFF
SETLOCAL
SET "exe=7+ Taskbar Tweaker.exe"
FOR /F %%x IN ('tasklist ^|FINDSTR /i /b /L /c:"%EXE%"') DO IF NOT ERRORLEVEL 1 goto ProcessFound1
ECHO "%exe%" not found
GOTO again
:Processfound1
ECHO "%exe%" found!
:again
SET "exe=I dont exist.exe"
FOR /F %%x IN ('tasklist ^|FINDSTR /i /b /L /c:"%EXE%"') DO IF NOT ERRORLEVEL 1 goto ProcessFound1
ECHO "%exe%" not found
GOTO :eof
:Processfound2
ECHO "%exe%" found!
GOTO :EOF

这可能对你有用。当然,您需要修复进程名称。

于 2014-10-23T05:36:41.540 回答
0

之前的答案都不适用于我识别带有嵌入空格的图像名。对我有用的是使用“delims=tab”,其中 tab 是实际的制表符,如下所示:

FOR /F "delims=tab" %%X IN ('tasklist /NH /FI "IMAGENAME eq !EXE!"') DO (...

结果 %%X 将是对应于 !EXE! 的整个任务列表条目 图像名称(如果找到)或“信息:没有与指定条件匹配的任务正在运行”,如果未找到,可以通过以下方式进行操作:

    SET TASKLINE=%%X
    IF "!TASKLINE!"=="!TASKLINE:No tasks are running=!" (
        ECHO !EXE! FOUND IN !TASKLINE!
    ) ELSE (
        ECHO !EXE! NOT FOUND IN !TASKLINE!))
于 2016-09-10T10:24:56.247 回答