2

我试图根据任务管理器或任务列表中的图像名称来查看应用程序当前是否正在运行......我使用 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

4 回答 4

2

比比较更好的是存在的考验

  if not defined status set "status=stopped"
于 2013-07-30T20:17:09.147 回答
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%

另请参阅此相关线程: 测试批处理文件中变量是否为空的正确方法是什么?

于 2013-07-30T20:11:54.370 回答
1

这是一种方法:

@echo off
set "prog=firefox.exe"
tasklist /fi "IMAGENAME EQ %prog%"| find /i "%prog%" >nul && (echo %prog% is running) || (echo %prog% is stopped)
于 2013-07-31T01:20:20.410 回答
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秒检查一次)

于 2017-01-11T16:40:30.267 回答