Wie kann ich überprüfen, ob eine Anwendung aus einer Batch-Datei (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 sie nur eine einzelne Instanz ist.)
Die Anwendung kann auch als beliebiger Benutzer ausgeführt werden.
windows
command-line
batch-file
Matt Lacey
quelle
quelle
Antworten:
Eine andere Möglichkeit, die ich mir durch die Verwendung von grep ausgedacht habe , ist:
Es muss keine zusätzliche Datei gespeichert werden, daher bevorzuge ich diese Methode.
quelle
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
geändert, damit es funktioniert ( ich vermute das Zitat um die if-Teile/?
Hilfebildschirm. So ist zum BeispielIMAGENAME
in polnischer VersionNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
Der erste NUL scheint unnötig, ich habe keine Ahnung, wofür die '2' ist, der / NH ist optional.So habe ich es ausgearbeitet:
Das oben genannte öffnet den Editor, wenn er noch nicht ausgeführt wird.
Bearbeiten: Beachten Sie, dass hierdurch keine Anwendungen gefunden werden, die in der Aufgabenliste versteckt sind. Dies schließt alle geplanten Aufgaben ein, die als anderer Benutzer ausgeführt werden, da diese automatisch ausgeblendet werden.
quelle
Ich mag Chaosmasters Lösung! Ich habe jedoch nach einer Lösung gesucht, die kein anderes externes Programm startet (wie find.exe oder findstr.exe ). Also habe ich die Idee aus 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 sie ...
Das funktioniert gut für mich ...
quelle
Der Vorschlag von npocmaka, QPROCESS anstelle von TASKLIST zu verwenden, ist großartig, aber seine 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:
Der obige Code wurde in Windows 7 mit einem Benutzer mit Administratorrechten getestet.
quelle
Unter Windows können Sie mithilfe der Windows-Verwaltungsinstrumentierung (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)
quelle
Only the administrator group members can use WMIC.EXE.
gefolgt vonReason:Win32 Error: Access is denied.
quelle
/i
.Ich verwende PV.exe von http://www.teamcti.com/pview/prcview.htm, das in Program Files \ PV mit einer Batchdatei wie der folgenden installiert ist:
quelle
Die Antwort von TrueY schien die eleganteste Lösung zu sein, aber ich musste ein bisschen herumspielen, weil ich nicht verstand, was genau los war. Lassen Sie mich die Dinge klären, um hoffentlich etwas Zeit für die nächste Person zu sparen.
Die modifizierte Antwort von TrueY:
Wie auch immer, ich hoffe das hilft. Ich weiß, dass das Lesen von Batch- / Befehlszeilen manchmal verwirrend sein kann, wenn Sie wie ich ein Neuling sind.
quelle
Die Antwort von Matt Lacey funktioniert unter Windows XP. In Windows Server 2003 jedoch die Zeile
kehrt zurück
Dies wird dann gelesen, während der Prozess ausgeführt wird.
Ich habe keine Erfahrung mit Batch-Skripten, daher ist es meine Aufgabe, nach dem Prozessnamen in der
search.log
Datei zu suchen, die Ergebnisse in eine andere Datei zu pumpen und diese nach Ausgaben zu durchsuchen.Ich hoffe das hilft jemand anderem.
quelle
Ich mag die
WMIC
undTASKLIST
Tools, aber sie sind nicht in den Home / Basic-Editionen vonQPROCESS
Windows verfügbar. Eine andere Möglichkeit besteht darin, Befehle zu verwenden, die auf fast jedem Windows-Computer verfügbar sind (für diejenigen, die Terminaldienste haben - ich denke, nur XP ohne SP2 zu gewinnen, also praktisch jeden Windows-Maschine):QPROCESS
Der Befehl ist nicht so leistungsfähig wieTASKLIST
und zeigt nur 12 Symbole des Prozessnamens an. Er sollte jedoch berücksichtigt werden, wenn erTASKLIST
nicht verfügbar ist.Einfachere Verwendung, wenn der Name verwendet wird, wenn der Prozess als Argument dient (das
.exe
Suffix ist in diesem Fall obligatorisch, wenn Sie den Namen der ausführbaren Datei übergeben):Der Unterschied zwischen zwei
QPROCESS
Verwendungsarten besteht darin, dassQPROCESS *
alle Prozesse aufgelistetQPROCESS some.exe
werden, während nur die Prozesse für den aktuellen Benutzer gefiltert werden.Die Verwendung von
WMI
Objekten über Windows Script Host Exe anstelle vonWMIC
ist ebenfalls eine Option. Sie sollte auch auf jedem Windows-Computer ausgeführt werden (mit Ausnahme derjenigen, auf denen der WSH deaktiviert ist, dies ist jedoch ein seltener Fall). Hier ist eine Bat-Datei, in der alle Prozesse über WMI aufgelistet sind Klassen und kann anstelle desQPROCESS
obigen Skripts verwendet werden (es ist ein jscript / bat-Hybrid und sollte als gespeichert werden.bat
):Und eine Änderung, die überprüft, ob ein Prozess ausgeführt wird:
Die beiden Optionen können auf Maschinen verwendet werden, die keine haben
TASKLIST
.Die ultimative Technik ist die Verwendung
MSHTA
. Dies wird auf jedem Windows-Computer ab XP ausgeführt und hängt nicht von den Windows-Skript-Hosteinstellungen ab. Der Aufruf vonMSHTA
könnte die Leistung jedoch ein wenig reduzieren (sollte wieder als Fledermaus gespeichert werden):quelle
Ich weiß nicht, wie ich das mit eingebautem CMD machen soll, aber wenn Sie grep haben , können Sie Folgendes versuchen:
quelle
Nur zu erwähnen, wenn Ihr Aufgabenname wirklich lang ist, wird er nicht vollständig in der Liste angezeigt
tasklist
Ergebnis Daher ist es möglicherweise sicherer (außer bei der Lokalisierung), nach dem Gegenteil zu suchen.Variation dieser Antwort :
quelle
Ich gehe hier von Fenstern aus. Sie müssen also WMI verwenden, um diese Informationen zu erhalten. In den Archiven von The Scripting Guy finden Sie viele Beispiele zur Verwendung von WMI in einem Skript.
quelle
Ich habe das Skript von Matt (2008-10-02) verwendet. Das einzige, mit dem ich Probleme hatte, war, dass die
search.log
Datei nicht gelöscht wurde . Ich erwarte, weil ich ancd
einen anderen Ort musste, um mein Programm zu starten. Ich würdecd
dorthin zurückkehren, wo sich die BAT-Dateisearch.log
befindet, aber sie würde immer noch nicht gelöscht. Also habe ich das behoben, indem ich diesearch.log
Datei zuerst statt zuletzt gelöscht habe .quelle
Sie sollten die übergeordneten Prozessnamen überprüfen, siehe The Code Project Artikel über eine .NET - basierte Lösung ** .
Eine nicht programmatische Methode zur Überprüfung:
c:\windows\notepad.exe
)Dasselbe kann überprüft werden, indem der Name des übergeordneten Prozesses abgerufen wird.
quelle
Aufbauend auf vtrz Antwort und Samuel Renkert Antwort auf ein anderes Thema , kam ich mit dem folgenden Skript, die nur läuft ,
%EXEC_CMD%
wenn es nicht bereits ausgeführt wird :Wie bereits erwähnt, sind hierfür Administratorrechte erforderlich.
quelle
Node - (computer name) ERROR: Description = Invalid query
Ich brauchte eine Lösung mit einem erneuten Versuch. Dieser Code wird ausgeführt, bis der Prozess gefunden wurde, und beendet ihn dann. Sie können eine Zeitüberschreitung oder etwas anderes einstellen, wenn Sie möchten.
Anmerkungen:
taskkill.bat
::Laufen Sie mit
.\taskkill.bat ProgramToKill.exe
quelle
Normalerweise führe ich den folgenden Befehl in der cmd-Eingabeaufforderung aus, um zu überprüfen, ob meine program.exe ausgeführt wird oder nicht:
quelle