2013-07-30 56 views
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. 

你有一个想法,为什么这是或建议另一种方式去实现这一目标?

+0

使用更好'如果未定义状态设置'status =已停止'' – Endoro

回答

1

试试这个:

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

的问题是,状态有空格在里面,它是由引号,但没有括号处理。尝试下面的批处理文件以查看正在发生的事情...在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?

+0

设置“STATUS =”而不是设置STATUS =是一种很好的做法,因此您不会引入尾随空格! – RGuggisberg

+0

关于你的链接,请注意:'%1'是**不是**变量,它是一个批处理参数。 – Endoro

2

比比较好是存在的测试:

if not defined status set "status=stopped" 
1

这里有一个方法:

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

最好我见过的方式(fo [R我)是这样的,这是从这里另一个用户堆栈,不能找到虽然原来的问题:

: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秒)