Frage von Firas2, 51

Batch/vbs: Wie kann man eine if-Bedingung mit Dateieinschaltung verbinden?

Ich meine damit, dass bsp. if NOT [Datei geöffnet] start Datei

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von S1r1us13, 14

Das geht gar nicht mit IF, dazu musst du die Prozesse überprüfen:

tasklist /NH /FI "imagename eq [Prozess.exe]" | findstr /i /C:"[Prozess.exe]" >nul 2>nul || start Datei

Der TASKLIST-Befehl listet alle gestarteten Prozesse auf. "/NH" steht für "No Header", wodurch die Überschriften weggelassen werden. Auf /FI folgt ein Filter, "eq" bedeutet "equals". Es werden also alle gestarteten Prozesse namens "Prozess.exe" aufgelistet.

Mit Hilfe von " | " bezieht sich der Folgebefehl auf den Output des vorigen Befehls. FINDSTR sucht also "Prozess.exe" in dem Output des TASKLIST-Befehls. "/i" ignoriert Groß- und Kleinschreibung. "/C:" sucht nach der folgenden Zeichenfolge auch mit Punkt (ohne /C würde er nach "Prozess" und nach "exe" suchen).

">nul 2>nul" unterdrücken die Ausgabe des FINDSTR-Befehls. Die brauchen wir nicht, wir wollen nur wissen, ob der Befehl was gefunden hat oder nicht.

Mit " || " wird der folgende Befehl nur ausgeführt, wenn der vorangegangene erfolglos war. Das Gegenstück dazu ist "&&".

Das ganze funktioniert nur bei Dateien, die als Prozess ausgeführt werden. Batchdateien hingegen werden über CMD.EXE ausgeführt. Um zu prüfen, ob eine bestimmte Batchdatei geöffnet ist, musst du wissen, welchen Titel das CMD-Fenster mit der Batchdatei hat:

tasklist /NH /FI "imagename eq cmd.exe" /FI "windowtitle eq [Fenstertitel]" | findstr /i /C:"cmd.exe" >nul 2>nul || start Datei

Damit das funktioniert, musst du den genauen Fenstertitel wissen, nicht nur einen Teil davon. Suchst du z. B. nach "Fenster" im Fenstertitel, während der Titel eigentlich "Fenster 1" ist, findet CMD es nicht.

Kommentar von Firas2 ,

ich glaube ich mache etwas falsch. Wenn ich an der stelle || eingebe, wird das Programm die ganze Zeit neu geöffnet. Wenn ich && eingebe, dann kommt mir die ganze Zeit eine Fehleranzeige.

Kommentar von S1r1us13 ,

Wenn du || benutzt, startet das Programm "Datei", wenn "Prozess.exe" bzw. cmd.exe mit "Fenstertitel" nicht läuft.

Wenn du && benutzt, startet das Programm "Datei", wenn "Prozess.exe" bzw. cmd.exe mit "Fenstertitel" läuft.

Prüfst du auf Existenz von sich selbst, wird
sich das Programm bei && unendlich oft selbst aufrufen.

Eine Fehlermeldung dürfte aber in keinem Fall auftreten. Welche Befehlsfolge benutzt du genau?

Antwort
von Tschoo, 27

Ja, genau so wie du es geschrieben hast

Kommentar von Firas2 ,

verstehe ich nicht... ich meine also Dateipfad eingeben, dann welches Wort? Oder wie?

Kommentar von Firas2 ,

wenn man die existenz überprüfen möchte, dann schreibt man if exist... aber wie ist es hier?

Kommentar von Tschoo ,

"if !exist(Datei) ...."

oder, falls es gibt

"if not exist(Datei) ..."

oder, ganz anderst

"if exists (Datei) then

                        else ... " (Datei existiert nicht -> else-Zweig)

Kommentar von Firas2 ,

ich glaube, Sie verstehen etwas falsch. er soll nicht die existenz überprüfen, sondern ob die Datei jetzt geöffnet ist.

Kommentar von Tschoo ,

Ja, stimmt -- tut mir leid.

Keine passende Antwort gefunden?

Fragen Sie die Community