检测文件名中含有空格的正在运行的进程

检测文件名中含有空格的正在运行的进程

我正在尝试使用批处理文件检测 Windows 7 上正在运行的进程。没有任何空格的进程可以正常工作 - 例如 notepad.exe。我不明白为什么它不起作用,非常感谢任何帮助。

代码

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set "EXE=My Process.exe"

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

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

预期结果

C:\test.bat
1

实际结果

C:\test.bat
'Process.exe' is not recognized as an internal or external command,
operable program or batch file.
0

答案1

您的代码有一个主要问题,它与进程名称中的空格无关。

运行时tasklist /NH返回的每一行不仅仅是进程的名称:

C:\temp>tasklist /nh

System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      2,200 K
smss.exe                       400 Services                   0      1,232 K

因此,您尝试采取如下方式:

System Idle Process 0 Services 0 24 K(这将%%x保持不变),并查看它是否等于提供的进程名称(即System Idle Process:)。

由于每行提供的额外信息永远不会相等,因此您需要找到一种方法来获取列表(或进一步提取)仅有的进程名称。

还:

set "EXE=My Process.exe"不需要引号。它知道等号后面的所有内容都是分配给左侧变量的值。因此,set EXE=My Process.exe即使有空格,也能正常工作。

在值部分周围加上引号(如注释中建议的那样)是分隔字符串的常用方法,但由于 Set 不是基于类型的(它不知道字符串、数字还是三角形等),因此它将包含引号。这set Filename="My Name"意味着 Filename 的值现在是"My Name",包括引号。当稍后尝试使用它时(在其他命令中的其他引号之间等),这可能会造成混淆/破坏。

答案2

我发现了一些可以完成这项工作的不同代码:

@echo off
tasklist /nh /fi "imagename eq My Process.exe" | find /i "My Process.exe" >nul && (
echo 1
) || (
echo 0
)

答案3

我偶然发现了这一点,但答案对我的情况没有帮助,所以我为任何遇到类似情况的人找到了一种解决方法。

正如我之前提到的其他答案,set "EXE=My Process.exe"没有引号也可以正常工作。

更大的问题来自于 for 循环,如果你像以前那样运行它,FOR /F %%x那么你会注意到 %%x 只包含该过程的第一个单词,在此示例中MyMy Process.exe

要修复此问题,您可以在 FOR /F 循环命令中使用 token 和 delims 标志。通过添加前 2 个字符串作为标记,您将获得 2 个变量MyProcess.exe,然后将它们组合起来并与原始EXE变量进行比较。

看起来应该是这样的:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set EXE=My Process.exe

FOR /F "tokens=1,2 delims= " %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

相关内容