2013-07-30 51 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秒)