我正在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...
我很确定这是因为第二个进程名称中有空格吗?
您能解释一下解决此问题所需的更改吗?
答案 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
命令返回的输出。