在批处理 FOR /F 命令中使用空格



我正在Windows中编写一个批处理文件,以测试某些进程是否正在运行,并发现以下脚本按预期工作。

set EXE=uTorrent.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo uTorrent is running...

但以下失败...

set EXE=Plex Media Server.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo Plex is running...

我很确定这是因为第二个进程名称中有空格?

您能否解释解决此问题所需的更改?

使用 for /f 而不指定 tokens= 时,默认值为 1 个标记。 使用默认的空格分隔符,这意味着它仅匹配多词搜索条件的第一个单词。

我尝试通过添加"tokens=*"并用双引号包装后面的比较来修复该示例,但这最终捕获了任务列表的完整输出,这不仅仅是进程的名称。

我不想只是在修复程序中硬编码,这会在下一个用例中中断,所以我反而想出了一些适合您的不同的东西。 它喜欢空间,而且是动态的,所以以后会适用于其他情况。

厘米:

set "zTarget=Secure System"
tasklist /nh /fi "imagename eq %zTarget%" 2>&1 | findstr /c:"%zTarget%" >nul 2>&1 && (echo yes, {%zTarget%} is running) || (echo no, {%zTarget%} is not running)

输出:

yes, {Secure System} is running

这不是解决问题的最优雅的方法,但它显示了如何做到这一点。我们基本上确定应用程序名称中有多少个空格,然后调用相应的 FOR。

set EXE=Memory Compression
set count=0
for %%a in (%EXE%) do set /a count+=1
IF "%count%"=="1" FOR /F %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G" == "%EXE%" echo app is running...
IF "%count%"=="2" FOR /F  "tokens=1,2" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" echo app is running...
IF "%count%"=="3" FOR /F  "tokens=1,2,3" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I" == "%EXE%" echo app is running...
IF "%count%"=="4" FOR /F  "tokens=1,2,3,4" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I %%J" == "%EXE%" echo app is running...

这是我最初的评论作为答案:

@Set "EXE=Plex Media Server.exe"
@TaskList|Find /I "%EXE%">Nul&&Echo Plex is running...

如果你想继续使用 For 循环方法,我建议这样做:

@Set "EXE=Plex Media Server.exe"
@For /F Delims^=^" %%A In ('TaskList /Fi "ImageName Eq %EXE%" /Fo:CSV /NH'
)Do @If /I "%%A"=="%EXE%" Echo %%~nA is running...

这可以通过包含 Find 命令来进一步完善 ('TaskList /Fi "ImageName Eq %EXE%" /Fo:CSV /NH^|Find /I "%EXE%"') ,但我省略了它,因为您正在对返回的输出使用 If 命令。

最新更新