Bir işlemin toplu komut dosyasıyla çalışıp çalışmadığını kontrol etme


260

Bir uygulamanın toplu (kuyu cmd) dosyasından çalışıp çalışmadığını nasıl kontrol edebilirim?

Bir program zaten çalışıyorsa başka bir örneği başlatmam gerekiyor. (Uygulamayı yalnızca tek bir örnek olacak şekilde değiştiremiyorum.)

Ayrıca uygulama herhangi bir kullanıcı olarak çalışıyor olabilir.



12
beş yıl sonra sorulan bir sorunun kopyası mı?
Matt Lacey

@ LưuVĩnhPhúc nispeten yakın bile değiller.
Kardinal - Reinstate Monica

@JackKirby bununla ilgili olmadığını kim söyledi?
phuclv

3
@oopsdazie evet bu durumda yanlış olabilirim ama genel kural soruyu en iyi cevap koleksiyonuyla tutmak ve diğerine zamandan bağımsız olarak bir kopya olarak kapatmaktır
phuclv

Yanıtlar:


330

Grep'ten esinlenerek bulduğum bir başka olasılık :

tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL
if "%ERRORLEVEL%"=="0" echo Program is running

Fazladan bir dosya kaydetmesi gerekmez, bu yüzden bu yöntemi tercih ederim.


7
bu benim için iyi çalıştı (windows XP SP3). IMHO Bu, sadece pencerelerle birlikte gelen araçları kullanarak burada önerilenlerin en zarif yoludur
hello_earth

2
Bu komut satırında sözdizimi sorunu yaşadım. Çalışması için tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL/ if %ERRORLEVEL%==1 goto wordnotrunningolarak değiştirdim (if parçaları etrafında alıntıdan şüpheleniyorum
Steve B

4
Lütfen XP'nin diğer dil sürümlerinde filtre adlarının kodla çevrildiğini, ancak yardım /?ekranında çevrilmediğini unutmayın . Yani örneğin IMAGENAMElehçe versiyonu NAZWA_OBRAZU.
30.11.2012

3
Win7 altında tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL ilk NUL gereksiz görünüyor, '2' ne için hiçbir fikrim yok, / NH isteğe bağlıdır.
Jan Doggen

12
görev listesi, eşleşen herhangi bir görev bulsun ya da bulmasın her zaman durum 0'dan çıkar, bu yüzden kendi başına işe yaramaz. Yine de çıktısını kontrol etmek için find (veya findstr) kullanmanız gerektiğinden, görev listesinin filtrelerini kullanmanın bir anlamı yoktur. Sadece görev listesi yapın | "myprog.exe"> nul: && goto foundit veya somesuch'u bulun. Görev listesine / v (ayrıntılı) seçeneğine ihtiyacınız olabilir.
Denis Howe

61

İşte böyle çalıştım:

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log

Yukarıda değilse, Not Defteri açılır .

Düzenle: Bunun görev listesinden gizlenmiş uygulamaları bulamayacağını unutmayın. Bu, farklı bir kullanıcı olarak çalışan tüm zamanlanmış görevleri içerecektir, çünkü bunlar otomatik olarak gizlenir.


2
Görev listesi formatını CSV veya tablo dışında herhangi bir şeyle değiştirmek önemlidir, çünkü görev listesi varsayılan düzeni (tablo) mantığı kıran uzun resim adlarını kısaltır.
Scott White

4
TASKLIST, işlem bulunmasa bile bazı çıktılar ürettiğinden bu çözüm Vista'da çalışmaz. Aynı şeyin Windows 7 için de geçerli olduğunu düşünüyorum
dbenham

search.log, "BİLGİ: Belirtilen ölçütlerle eşleşen hiçbir görev çalışmıyor." içeriyor. ve bir not defteri başlatılmadı
Sergey

46

Chaosmaster'ın çözümünü seviyorum! Ama başka bir harici program ( find.exe veya findstr.exe gibi ) başlatmayan bir çözüm aradım . Bu yüzden fikri de önlenebilir bir geçici dosya oluşturan Matt Lacey'ın çözümünden ekledim. Sonunda oldukça basit bir çözüm bulabilirdim, bu yüzden paylaşıyorum ...

SETLOCAL EnableExtensions
set EXE=myprog.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo Not running
goto FIN
:FOUND
echo Running
:FIN

Bu benim için iyi çalışıyor ...


Bu çözüm Windows 8.1'de iyi test edilmiştir. Büyük / küçük harfe duyarlı olduğunu fark ettim.
oliver-clare

@LordScree Un * x sistemlerinde çalışırken büyük / küçük harf duyarlılığı benim için iyidir! Hatta dosya sistemini büyük / küçük harfe duyarlı dosya adlarını etkinleştirecek şekilde ayarladım. ;)
TrueY

Benim için iyi çalışıyor - Windows 7'de test edildi X64
Bay Rubix

Uygulama adında bir boşluk varsa,% x ilk boşluğa kadar uygulama adının bir parçası olduğu için çalışmaz.
Chris

Olası bir çözüm% x == INFO olup olmadığını kontrol ederek uygulamanın bulunup bulunmadığını kontrol etmek olacaktır: ancak bunun hangi Windows sürümlerinde çalışacağını veya daha iyi bir çözüm olup olmadığını bilmiyorum.
Chris

21

Npocmaka'nın TASKLIST yerine QPROCESS'i kullanması önerisi harika ama cevabı o kadar büyük ve karmaşık ki, sanırım, çoğu gelişmiş olmayan kullanıcının problemini çözecek kadar basitleştirilmiş bir versiyonunu yayınlamak zorundayım:

QPROCESS "myprocess.exe">NUL
IF %ERRORLEVEL% EQU 0 ECHO "Process running"

Yukarıdaki kod, yönetici haklarına sahip bir kullanıcıyla Windows 7'de test edildi.


Ben sadece bu fikri otomatik olarak iki kez ateşlemeyi durdurmak için kullandım ve bir cazibe gibi çalıştı!
Davy C

Bu komutun aksine, görev listesi çözümlerinin sadece böyle basit bir sorgu için çok karmaşık görünmekle kalmayıp, aynı zamanda bir saniye kadar çalıştırıp tonlarca cpu kullandığını söylemeliyim! Bu çok daha iyi, yönetici izinleri olmadan da çalıştı (Windows Server 2012).
Eugene Marin

Bu, uygulamanın adında boşluk olduğunda olduğu gibi çalıştığı için (en azından benim için) en basit ve en iyi çözüm gibi görünüyor. Bu çözümün sınırlarının ne olduğunu ve neden daha fazla oyu olmadığını merak ediyorum.
Chris

20

Windows altında, belirtilen komut satırına sahip hiçbir uygulamanın başlatılmamasını sağlamak için Windows Yönetim Araçları'nı (WMI) kullanabilirsiniz, örneğin:

wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)


WMIC'nin yönetici ayrıcalıkları gerektirdiğini unutmayın; Eğer yoksa, o zaman Only the administrator group members can use WMIC.EXE.bunu takibenReason:Win32 Error: Access is denied.
Jeroen Wiert Pluimers

Bu en iyi çözüm olduğunu düşünüyorum, çünkü wmic size tam bir komut satırı başlatıldı ve diğer bilgileri milion verir ...
Glavić

14
TASKLIST | FINDSTR ProgramName || START "" "Path\ProgramName.exe"

3
Bu gerçekten harika çalışıyor. Basit! Eklemediğiniz sürece büyük / küçük harfe duyarlı olduğunu unutmayın /i.
Jason

8

Program Files \ PV'de kurulu http://www.teamcti.com/pview/prcview.htm adresinden PV.exe'yi böyle bir toplu iş dosyasıyla kullanıyorum:

@echo off
PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\YourProgram
PV.EXE YourProgram.exe >nul
if ERRORLEVEL 1 goto Process_NotFound
:Process_Found
echo YourProgram is running
goto END
:Process_NotFound
echo YourProgram is not running
YourProgram.exe
goto END
:END

1
Windows 7'de bu benim için çalışıyor. 2. satır, programın kendisini içeren dizindir.
Fabio Cionini

8

TrueY'nin cevabı en zarif çözüm gibi görünüyordu, ancak etrafta biraz karışıklık yapmak zorunda kaldım çünkü neler olduğunu tam olarak anlamadım. Bir sonraki kişi için biraz zaman kazanmamı umuyorum.

TrueY'nin değiştirilmiş Cevabı:

::Change the name of notepad.exe to the process .exe that you're trying to track
::Process names are CASE SENSITIVE, so notepad.exe works but Notepad.exe does NOT
::Do not change IMAGENAME
::You can Copy and Paste this into an empty batch file and change the name of
::notepad.exe to the process you'd like to track
::Also, some large programs take a while to no longer show as not running, so
::give this batch a few seconds timer to avoid a false result!!

@echo off
SETLOCAL EnableExtensions

set EXE=notepad.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound

goto ProcessNotFound

:ProcessFound

echo %EXE% is running
goto END
:ProcessNotFound
echo %EXE% is not running
goto END
:END
echo Finished!

Her neyse, umarım bu yardımcı olur. Bazen benim gibi bir acemi iseniz, toplu / komut satırı okumak bazen kafa karıştırıcı olabilir biliyorum.


6

Matt Lacey tarafından verilen cevap Windows XP için çalışıyor. Ancak, Windows Server 2003'te satır

 tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

İadeler

BİLGİ: Belirtilen ölçütlerle eşleşen hiçbir görev çalışmıyor.

bu işlem yapılırken okunur.

Toplu komut dosyası oluşturma deneyimi yığını yok, bu yüzden ruhum daha sonra search.logdosyadaki işlem adını aramak ve sonuçları başka bir dosyaya pompalamak ve herhangi bir çıktı için arama yapmaktır.

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FINDSTR notepad.exe search.log > found.log

FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log
del found.log

Umarım bunun bir başkasına yardımı olur.


Bu, Win 2008 için çalışır. +1 için +1 Belirtilen ölçütlerle eşleşen görev yok.
Mangesh Pimpalkar

5

Ben WMICve TASKLISTaraçları seviyorum ama pencerelerin ev / temel sürümlerinde mevcut değildir.Başka bir yol QPROCESShemen hemen her windows makinede mevcut komutu kullanmaktır (terminal hizmetleri olanlar için - Ben sadece SP2 olmadan XP kazanmak düşünüyorum, bu yüzden her windows machine) ile ilişkili olan kısmını dışarı aktarmak suretiyle yedek oluşturmanız gerekir:

@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
:: QPROCESS can display only the first 12 symbols of the running process
:: If other tool is used the line bellow could be deleted
set process_to_check=%process_to_check:~0,12%

QPROCESS * | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal

QPROCESSkomut, TASKLISTişlem adının yalnızca 12 sembolünü gösterecek kadar güçlü değildir ve sınırlıdır, ancak TASKLISTmevcut değilse dikkate alınmalıdır .

İşlem bir bağımsız değişken olarak adı kullanıyorsa daha basit kullanım ( .exebu durumda, yürütülebilir adı ilettiğinizde sonek zorunludur):

@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
:: .exe suffix is mandatory
set "process_to_check=%~1"


QPROCESS "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal

İki QPROCESSkullanım yolu arasındaki fark , QPROCESS *tüm işlemleri listelerken QPROCESS some.exeyalnızca geçerli kullanıcının işlemlerini filtreleyecektir.

Kullanma WMIyerine windows script host exe sayesinde nesneleri WMIC.Here yarasa dosyası bir option.It her pencereler makinede de çalışmalıdır olan (WSH kapalıdır olanları hariç fakat bu nadir bir durumdur) o WMI aracılığıyla listeleri tüm süreçler sınıflar ve QPROCESSyukarıdaki komut dosyası yerine kullanılabilir (bir jscript / bat melezidir ve şu şekilde kaydedilmelidir .bat):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **


@echo off
cscript //E:JScript //nologo "%~f0"
exit /b

************** end of JSCRIPT COMMENT **/


var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes =  new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    WScript.Echo( process.processID + "   " + process.Name );
}

Ve bir işlemin çalışıp çalışmadığını kontrol edecek bir değişiklik:

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **


@echo off
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1

cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)

exit /b

************** end of JSCRIPT COMMENT **/


var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes =  new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    WScript.Echo( process.processID + "   " + process.Name );
}

İki seçenek, özelliği olmayan makinelerde kullanılabilir TASKLIST.

Nihai teknik kullanmaktır MSHTA. Bu, XP ve üzeri her Windows makinesinde çalışır ve Windows komut dosyası ana bilgisayar ayarlarına bağlı değildir. çağrı MSHTAbir az şey azaltabilecek performansı olsa (yine bat olarak kaydedilmelidir) bit:

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off

setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running

set process_to_check=%~1


mshta "about:<script language='javascript' src='file://%~dpnxf0'></script>" | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal
exit /b
************** end of JSCRIPT COMMENT **/


   var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);


   var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
   var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
   var processes =  new Enumerator(colProcess);
   for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    fso.Write( process.processID + "   " + process.Name + "\n");
   }
   close();

2

Dahili CMD ile bunu nasıl yapacağımı bilmiyorum ama grep'iniz varsa aşağıdakileri deneyebilirsiniz:

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"

2

Sadece belirtmek gerekirse, görev adınız gerçekten uzunsa, tasklistsonuçta bütünüyle görünmez , bu yüzden tam tersini kontrol etmek daha güvenli olabilir (yerelleştirme dışında).

Bu cevabın varyasyonu :

:: in case your task name is really long, check for the 'opposite' and find  the message when it's not there
tasklist /fi "imagename eq yourreallylongtasknamethatwontfitinthelist.exe" 2>NUL | find /I /N "no tasks are running">NUL
if "%errorlevel%"=="0" (
    echo Task Found
) else (
    echo Not Found Task
)

0

Burada pencereler varsayıyorum. Bu nedenle, bu bilgileri almak için WMI kullanmanız gerekir. Bir komut dosyasından WMI'nın nasıl kullanılacağına dair birçok örnek için Scripting Guy arşivlerine göz atın .


0

Matt (2008-10-02) tarafından sağlanan senaryoyu kullandım . Sorun yaşadığım tek şey search.logdosyayı silmeyecekti . cdProgramımı başlatmak için başka bir yere gitmem gerektiği için bekliyorum . Ben cd'd BAT dosyası ve yere geri search.logvardır, ama yine de silmek olmaz. Bu yüzden search.logdosyayı önce son yerine silerek çözdüm .

del search.log

tasklist /FI "IMAGENAME eq myprog.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%-zA EQU 0 GOTO end

cd "C:\Program Files\MyLoc\bin"

myprog.exe myuser mypwd

:end

1
@Sebastian: Buraya biraz fazladan bilgi eklendi, bu yüzden bir cevap olarak bırakma eğilimindeyim.
Kertenkele Bill

0

Üst işlem adını kontrol etmelisiniz, .NET tabanlı bir çözüm hakkında ** Code Project makalesine bakın .

Programlı olmayan bir kontrol yöntemi:

  1. Cmd.exe'yi başlat
  2. Bir uygulama başlatın (örneğin, c:\windows\notepad.exe)
  3. Process Explorer'da Notepad.exe işleminin özelliklerini denetleme
  4. Üst işlemi kontrol edin (Bu cmd.exe'yi gösterir)

Aynı şey üst işlem adı alınarak da kontrol edilebilir.


0

Bina vtrz cevabı ve bir diğer konu üzerine Samuel Renkert cevabı , sadece çalışır aşağıdaki komut ile geldi %EXEC_CMD%zaten çalışır durumda değilse:

@echo off
set EXEC_CMD="rsync.exe"
wmic process where (name=%EXEC_CMD%) get commandline | findstr /i %EXEC_CMD%> NUL
if errorlevel 1 (
    %EXEC_CMD% ...
) else (
    @echo not starting %EXEC_CMD%: already running.
)

Daha önce de söylendiği gibi, bu yönetimsel ayrıcalıklar gerektirir.


benim için çalışmadı ve ben bir yönetici hesabı kullanıyorum. Bir DOS kutusu görünürNode - (computer name) ERROR: Description = Invalid query
khaverim

1
Benim için iyi çalışıyor.
Mark Duncan

1
Burada Windows 7 için harika çalışıyor. Sorun yok.
galacticninja

0

Yeniden denemek için bir çözüme ihtiyacım vardı. Bu kod, işlem bulunana kadar çalışır ve sonra onu öldürür. İsterseniz bir zaman aşımı veya herhangi bir şey ayarlayabilirsiniz.

Notlar:

  • ".Exe" zorunludur
  • Aşağıdaki sürümle parametrelerle çalıştırılabilir bir dosya yapabilirsiniz
    :: Set programm you want to kill
    :: Fileextension is mandatory
    SET KillProg=explorer.exe

    :: Set waiting time between 2 requests in seconds
    SET /A "_wait=3"

    :ProcessNotFound
        tasklist /NH /FI "IMAGENAME eq %KillProg%" | FIND /I "%KillProg%"
        IF "%ERRORLEVEL%"=="0" (
            TASKKILL.EXE /F /T /IM %KillProg%
        ) ELSE (
            timeout /t %_wait%
            GOTO :ProcessNotFound
        )

taskkill.bat:

    :: Get program name from argumentlist
    IF NOT "%~1"=="" (
        SET "KillProg=%~1"
    ) ELSE (
        ECHO Usage: "%~nx0" ProgramToKill.exe & EXIT /B
    )

    :: Set waiting time between 2 requests in seconds
    SET /A "_wait=3"

    :ProcessNotFound
        tasklist /NH /FI "IMAGENAME eq %KillProg%" | FIND /I "%KillProg%"
        IF "%ERRORLEVEL%"=="0" (
            TASKKILL.EXE /F /T /IM %KillProg%
        ) ELSE (
            timeout /t %_wait%
            GOTO :ProcessNotFound
        )

Şununla koş: .\taskkill.bat ProgramToKill.exe


-2

Genellikle benim program.exe çalışıp çalışmadığını kontrol etmek için cmd isteminde aşağıdaki komutu yürütmek:

tasklist | grep program
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.