it-swarm.com.de

So prüfen Sie, ob ein Prozess über ein Batch-Skript ausgeführt wird

Wie kann ich überprüfen, ob eine Anwendung über eine Batchdatei (well cmd) ausgeführt wird?

Ich muss keine weitere Instanz starten, wenn bereits ein Programm ausgeführt wird. (Ich kann die App nicht so ändern, dass nur eine Instanz erstellt wird.)

Die Anwendung kann auch als beliebiger Benutzer ausgeführt werden.

242
Matt Lacey

Eine andere Möglichkeit, die ich mit grep gefunden habe, ist:

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

Es muss keine zusätzliche Datei gespeichert werden, daher bevorzuge ich diese Methode.

302
Chaosmaster

So habe ich es ausgearbeitet:

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

Das obige öffnet sich Notepad wenn es noch nicht läuft.

Bearbeiten: Beachten Sie, dass dies keine Anwendungen findet, die in der Jobliste verborgen sind. Dies schließt alle geplanten Aufgaben ein, die als ein anderer Benutzer ausgeführt werden, da diese automatisch ausgeblendet werden.

59
Matt Lacey

Ich mag Chaosmasters Lösung! Ich habe aber nach einer Lösung gesucht, die kein anderes externes Programm startet (wie find.exe oder findstr.exe ). Also habe ich die Idee von Matt Laceys Lösung hinzugefügt, die eine ebenfalls vermeidbare temporäre Datei erstellt. Am Ende konnte ich eine ziemlich einfache Lösung finden, also teile ich es ...

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

Das funktioniert für mich gut ...

38
TrueY

Unter Windows können Sie mithilfe der Windows-Verwaltungsinstrumentation (Windows Management Instrumentation, WMI) sicherstellen, dass keine Apps mit der angegebenen Befehlszeile gestartet werden. Beispiel:

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)

21
vtrz

Der Vorschlag von npocmaka, QPROCESS anstelle von TASKLIST zu verwenden, ist großartig, aber die Antwort ist so umfangreich und komplex, dass ich mich verpflichtet fühle, eine recht vereinfachte Version davon zu veröffentlichen, die das Problem der meisten nicht fortgeschrittenen Benutzer lösen wird:

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

Der obige Code wurde unter Windows 7 mit einem Benutzer mit Administratorrechten getestet.

18
aldemarcalazans

Die Antwort von TrueY schien die eleganteste Lösung zu sein, aber ich musste ein bisschen herumspielen, weil ich nicht verstand, was genau vor sich ging. Lassen Sie mich die Dinge klären, um hoffentlich etwas Zeit für die nächste Person zu sparen.

TrueY's modifizierte Antwort:

::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!

Wie auch immer, ich hoffe das hilft. Ich weiß, dass das Lesen von Batch-/Befehlszeilen manchmal etwas verwirrend sein kann, wenn Sie wie ich ein Neuling sind.

8

Ich verwende PV.exe von http://www.teamcti.com/pview/prcview.htm installiert in Program Files\PV mit einer Batch-Datei wie folgt:

@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
8
Adam

Das Antwort von Matt Lacey funktioniert unter Windows XP. In Windows Server 2003 ist die Leitung jedoch

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

kehrt zurück

INFO: Es werden keine Aufgaben ausgeführt, die den angegebenen Kriterien entsprechen.

das wird dann gelesen, während der Prozess läuft.

Ich habe nicht viel Erfahrung mit Batch-Skripten. Daher besteht meine Aufgabe darin, in der Datei search.log Nach dem Prozessnamen zu suchen, die Ergebnisse in eine andere Datei zu pumpen und nach Ausgaben zu suchen.

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

Ich hoffe das hilft jemand anderem.

6
benmod
TASKLIST | FINDSTR ProgramName || START "" "Path\ProgramName.exe"
6

Ich mag die Werkzeuge WMIC und TASKLIST, aber sie sind nicht in den Haupt-/Basiseditionen von Windows verfügbar. Eine andere Möglichkeit besteht darin, den Befehl QPROCESS zu verwenden, der auf fast jedem Windows-Computer verfügbar ist (z diejenigen, die Terminaldienste haben - ich denke, nur gewinnen XP ohne SP2, so praktisch jede Windows-Maschine):

@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

QPROCESS Der Befehl ist nicht so mächtig wie TASKLIST und zeigt nur 12 an Symbole des Prozessnamens, sollten jedoch berücksichtigt werden, wenn TASKLIST nicht verfügbar ist.

Einfachere Verwendung, wenn der Name als Argument verwendet wird (das Suffix .exe Ist in diesem Fall obligatorisch, wenn Sie den Namen der ausführbaren Datei übergeben):

@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

Der Unterschied zwischen zwei Verwendungsarten von QPROCESS besteht darin, dass mit QPROCESS * Alle Prozesse aufgelistet werden, während mit QPROCESS some.exe Nur die Prozesse für den aktuellen Benutzer gefiltert werden.

Die Verwendung von WMI -Objekten über das Windows-Skript Host exe anstelle von WMIC ist ebenfalls eine Option. Sie sollte auch auf jedem Windows-Computer ausgeführt werden (mit Ausnahme derer, auf denen der WSH deaktiviert ist, dies ist jedoch selten der Fall case) .Hier eine bat-Datei, die alle Prozesse durch WMI-Klassen auflistet und anstelle von QPROCESS im obigen Skript verwendet werden kann (es ist ein jscript/bat-Hybrid und sollte als .bat gespeichert werden):

@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 );
}

Und eine Änderung, die überprüft, ob ein Prozess ausgeführt wird:

@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 );
}

Die beiden Optionen können auf Computern ohne TASKLIST verwendet werden.

Die ultimative Technik ist die Verwendung von MSHTA. Dies wird auf jedem Windows - Rechner ab XP und höher ausgeführt und hängt nicht von den Host - Einstellungen des Windows - Skripts ab. Der Aufruf von MSHTA könnte jedoch die Leistung ein wenig beeinträchtigen (sollte es erneut sein) als Fledermaus gespeichert werden):

@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();
5
npocmaka

Ich weiß nicht, wie ich das mit eingebautem CMD machen soll, aber wenn Sie grep haben, können Sie Folgendes versuchen:

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

Nur zu erwähnen, wenn Ihr Aufgabenname wirklich lang ist, wird er nicht vollständig im tasklist -Ergebnis angezeigt. Daher ist es möglicherweise sicherer (außer der Lokalisierung), nach dem Gegenteil zu suchen.

Variation von diese Antwort :

:: 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
)
1
drzaus

Ich gehe hier von Fenstern aus. Sie müssen also WMI verwenden, um diese Informationen abzurufen. Schauen Sie sich The Scripting Guy's archives an, um viele Beispiele für die Verwendung von WMI in einem Skript zu erhalten.

0
NotMe

Ich habe das Skript von Matt (02.10.2008) verwendet. Das einzige, mit dem ich Probleme hatte, war, dass die Datei search.log Nicht gelöscht wurde. Ich gehe davon aus, dass ich cd an einen anderen Ort muss, um mein Programm zu starten. Ich würde cd dorthin zurückkehren, wo sich die BAT-Datei und search.log Befinden, aber sie würden trotzdem nicht gelöscht. Also habe ich das gelöst, indem ich die search.log - Datei zuerst und nicht zuletzt gelöscht habe.

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
0
Nin

Sie sollten den Namen des übergeordneten Prozesses überprüfen, siehe The Code Project Artikel über . NET based solution ** .

Eine nicht-programmatische Möglichkeit, Folgendes zu überprüfen:

  1. Starten Sie Cmd.exe
  2. Starten Sie eine Anwendung (z. B. c:\windows\notepad.exe)
  3. Überprüfen Sie die Eigenschaften des Prozesses Notepad.exe in Prozess-Explorer
  4. Auf übergeordneten Prozess prüfen (Dies zeigt cmd.exe)

Dasselbe kann überprüft werden, indem der übergeordnete Prozessname abgerufen wird.

0
prakash