批处理文件if语句失败

时间:2013-07-30 20:06:57

标签: batch-file task

我正在尝试根据任务管理器或任务列表中的图像名称来查看当前是否正在运行应用程序...我使用firefox.exe作为示例,但它总是失败。目标是在其已经运行时不启动另一个脚本和/或在需要时对其进行任务处理。

这是我目前的状态脚本:

@echo off
set STATUS=
FOR /F "tokens=*" %%A IN ('tasklist ^| findstr "firefox.exe"') DO SET STATUS=%%A
echo %STATUS%
if [%STATUS%]==[] set STATUS=stopped

echo %STATUS%

始终提供以下输出:(在if语句中始终失败)

firefox.exe                   6216 Console                    1    411,760 K
6216 was unexpected at this time.

您是否知道为什么会这样或建议另一种方法来实现这一目标?

4 个答案:

答案 0 :(得分:2)

优于比较存在的测试

  if not defined status set "status=stopped"

答案 1 :(得分:1)

请改为尝试:

if "%STATUS%"=="" set STATUS=stopped

问题是STATUS中有空格,它由引号处理,但不是括号。尝试下面的批处理文件,看看发生了什么......就在if语句之前,你会看到回显状态的值。

@echo off
set STATUS=
FOR /F "tokens=*" %%A IN ('tasklist ^| findstr "firefox.exe"') DO (
  SET STATUS=%%A
)
echo The status is "%STATUS%"
if [%STATUS%]==[] set STATUS=stopped

echo %STATUS%

另请参阅此相关主题: What is the proper way to test if variable is empty in a batch file?

答案 2 :(得分:1)

这是一种方法:

@echo off
set "prog=firefox.exe"
tasklist /fi "IMAGENAME EQ %prog%"| find /i "%prog%" >nul && (echo %prog% is running) || (echo %prog% is stopped)

答案 3 :(得分:1)

我见过的最好的方式(对我来说)是这个,来自堆叠的其他用户,但是找不到原始问题:

:LOOP
tasklist | find /i "program.exe" >nul 2>&1
IF ERRORLEVEL 1 (
  GOTO CONTINUE
) ELSE (
  ECHO Program still running!
  Timeout /T 3 /Nobreak
  GOTO LOOP
)

:CONTINUE

您可以调整所需的时间(每3秒检查一次)