在Batch FOR / F命令中使用空格

时间:2019-04-02 13:46:21

标签: windows batch-file

我正在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...

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

您能解释一下解决此问题所需的更改吗?

3 个答案:

答案 0 :(得分:0)

使用for /f而不指定tokens=时,默认值为1个令牌。并且使用默认的空格分隔符,这意味着它仅与多字搜索标准中的第一个单词匹配。

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

我不想只硬编码可能会在下一个用例中破坏的修补程序,所以我提出了一些对您有用的方法。它喜欢空间并且它是动态的,因此以后可以在其他情况下使用。

命令:

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

答案 1 :(得分:0)

这不是解决问题的最优雅的方法,但是它说明了如何实现。我们基本上确定应用程序名称中有多少空格,然后调用适当的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...

答案 2 :(得分:0)

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

@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命令返回的输出。