130834
Goto Top

Win10 ändert den Errorlevel? ( Batch )

Hey Leute,

Ich habe heute wieder mit Prozessen herumgebastelt, die sich gegenseitig überwachen.
Da plötzlich, habe ich einen Fehler. Der Fehler stellt sich als unbehebbar heraus!
Denn; offenbar funktioniert der errorlevel mit dem find Befehl ganz plötzlich komplett anders, und Programme tun nicht mehr das was sie tun.

Man sieht das ganz schön hier ran:

@echo off
set Programm=teamviewer
tasklist |find /i "%Programm%.exe" >nul   
if %errorlevel% == 0 ( 
taskkill /F /IM %Programm% & msg "%username%" %Programm% wurde Beendet!  
) else ( 
msg "%username%" %Programm% ist bereits Beendet!  
)
exit

Dieses Script hat früher überprüft ob Teamviewer läuft, falls ja den Prozess beendet und gesagt: Teamviewer wurde beendet und fals nein Teamviewer ist schon beendet.

Nach viel herumprobieren in meine aktuellen Projekt, habe ich dann auf meine Bibliothek zurückgegriffen um mir ein Beispiel dieser Funktion zu suchen, und habe das Script oben gefunden.
Ja. Das beste kommt aber noch: der Output dieses Script ist aktuell: Teamviewer wurde beendet; und das CMD Fenster gibt die Nachricht aus: Kein Prozess mit dieser ID gefunden.
Es wird noch schlimmer; nicht einmal wenn ich EQU 0 durch EQU 1 ersetzten würde funktioniert das Script. Es funktioniert einfach GAR NICHT mehr.
Wie soll ich denn jetzt bitte herausfinden ob ein Prozess mit einer bestimmten PID läuft oder nicht?

( Es kann sein das dieses Script für euch funktioniert; für mich hat es das Früher schließlich auch. Ich hab die neuste Windows 10 Version, btw )

Bitte helft mir ich weiß nicht mehr weiter Microsoft ist doof, und ihr neuster Versuch CMD zu ersetzten hat mir das Leben nicht einfacher gemacht....

Content-Key: 323561

Url: https://administrator.de/contentid/323561

Printed on: April 24, 2024 at 20:04 o'clock

Mitglied: 131381
131381 Dec 11, 2016 updated at 15:45:46 (UTC)
Goto Top
Nö, der Fehler ist dein Schnippsel ... face-smile
taskkill /F /IM %Programm% & msg "%username%" %Programm% wurde Beendet! 
hier vergisst du erstens das EXE am Ende des Prozessnamens und zweitens nutzt du kein doppeltes && damit die Meldung auch nur bei erfolgreichen Killen erscheint.

@echo off
set "Programm=teamviewer.exe"  
tasklist | find /i "%Programm%" >nul && (   
    taskkill /F /IM "%Programm%" && msg "%username%" "%Programm% wurde beendet!"  
) || ( 
    msg "%username%" "%Programm% ist bereits beendet!"  
)
Gruß
Member: Pjordorf
Pjordorf Dec 11, 2016 at 17:04:46 (UTC)
Goto Top
Hallo,

Zitat von @131381:
Nö, der Fehler ist dein Schnippsel ... face-smile
SI.

hier vergisst du erstens das EXE am Ende des Prozessnamens
Nee nicht wirklich. Sein
tasklist |find /i "%Programm%.exe" >nul  
enthält schon die Dateiendung.

Aber sein
Microsoft ist doof
ist wirklich doof. face-smile

Gruß,
Peter
Mitglied: 130834
130834 Dec 11, 2016 updated at 17:37:16 (UTC)
Goto Top
Und... wo bleibt der errorlevel? ausserdem geht es mir nicht um den Schnipsel direkt. es geht mir darum das es auch bei anderen Dingen nicht funkt... Ich will keine Programme töten, in erster Linie will ich überprüfen ob sie überhaupt laufen; das ist auch der Sinn des Schnipsels. Das Programm einfach umzubringen ginge auch ohne den Errorlevel und die Überprüfung dessen.
zb das hier:

tasklist /FI "PID eq !mpid! " /FI "STATUS eq running" | find ":"  
if %errorlevel% EQU 0 ( exit )

Das kommt aus meiner heutigen batch welche ihre eigene PID in eine Datei schreibt und diese beim Start ausliest....
so soll verhindert werden das sie mehrfach gestartet wird.
Also die batch wird gestartet, fals die datei existiert liests sie die PID darin, überprüft ob die PID läuft und fals nicht fährt sie fort mit was auch immer, und schreibt ihre eigene PID wieder in die Datei.
Leider scheint das mit dem oben nicht zu funktionieren. auch den die input daten korrekt sind ( ich habs überprüft ) scheint die funktion mit find keinen korrekten errorlevel zurückzugeben.
Mitglied: 131381
Solution 131381 Dec 11, 2016 updated at 18:22:47 (UTC)
Goto Top
Stichwort DelayedExpansion...

Wenn du den Errorlevel in einem mit Klammern versehenen Ausdruck abfragst (z.B. For-Schleife oder IF-Konstrukt mit Klammern) musst du auch Ausrufezeichen anstatt Prozentzeichen benutzen (!ERRORLEVEL!) um den vom vorherigen Befehl erzeugten Errorlevel abzufragen.

> Zitat von @Pjordorf:
Nee nicht wirklich. Sein
tasklist |find /i "%Programm%.exe" >nul  
enthält schon die Dateiendung.
Dort meinte ich es ja auch nicht sondern nur in meiner oben zitierten Stelle, Dr. Pjordorf face-wink!

Klappt alles wie vorgesehen auch im neuesten Windows 10, da hat sich in der Hinsicht nichts verändert, glaub mir, auch ich habe es überprüft. Du hast da einfach nur einen Denkfehler am heutigen Feiertag face-smile

Und... wo bleibt der errorlevel?

Member: Pjordorf
Pjordorf Dec 11, 2016 at 18:31:10 (UTC)
Goto Top
Hallo,

Zitat von @130834:
Und... wo bleibt der errorlevel?
Braucht es nicht. Aber selbstverständlich kannst du dir noch eine ErrorLevel abfrage mit IF einbauen, allerdings für deinen geschilderte Zweck - überflüssig.

um den Schnipsel direkt.
Aber der Schnippsel enthielt deinen Fehler. Warum reden wir über diesen Schnippsel wenn es dir um ganz was anderes geht?

es geht mir darum das es auch bei anderen Dingen nicht funkt...
Das Schnippsel tut was es soll. Fürs Telefonieren ist das nicht gedacht oder gebaut.

zb das hier:
Liefert ein leere Zeile wenn du kein : in der Ausgabe von Tasklist hast.

Leider scheint das mit dem oben nicht zu funktionieren
Dieses oben hier drin oder dein Ursprungliches oben?

Jedenfalls dein dein jetzt Beispielhaft genanntes Schnippsel tut was es soll und nichts anderes. Du wirst hier wohl Fehlermeldungen hinmalen müssen oder nicht mit Beispielschippsel um dich schmeißen.

Gruß,
Peter
Member: Pjordorf
Pjordorf Dec 11, 2016 at 18:38:21 (UTC)
Goto Top
Hi,

Zitat von @131381:
Dort meinte ich es ja auch nicht sondern nur in meiner oben zitierten Stelle, Dr. Pjordorf face-wink!
OK, habs gefunden. tatsächlich. Hab natürlich nicht wirklich dort ein Taskkill laufen lassen, daher nicht drauf geachtet. Dabke fürs drauf hinweisen in deiner wie immer unfehlbaren Art face-smile

Gruß,
gez. Dr Pjordorf. Prof in Ausbildung face-smile
Mitglied: 130834
130834 Dec 11, 2016 updated at 19:08:57 (UTC)
Goto Top
Also erstens:
Dort meinte ich es ja auch nicht sondern nur in meiner oben zitierten Stelle, Dr. Pjordorf !
nur das es komplett unnötig ist dort ein .exe zu setzten wenn man schon eins hat. Für was also? ich habe es nicht "vergessen" ic hhabe es wo anders platziert so das man es überhaupt nicht erst eingeben muss.

Zweitens: Bei der Abfrage wird keine...
Ach verdammt.-

Und Drittens:
Er kann nicht überflüssig werden wenn der Schnipsel nur dazu dient diesen zu demonstrieren.
Auch macht es keinen Sinn das dieser Schnipsel einmal zweifelsfrei funktioniert hat; Ich habe ihn etliche male auf Windows 7 getestet, und JETZT funktioniert er PLÖTZLICH nicht mehr. Woran könnte das nur liegen wenn gerade erst kürzlich STÜMPERHAFT von MICROSOFT an CMD herumgefingert wurde. Hmmm!


ich habe es überprüft. Du hast da einfach nur einen Denkfehler am heutigen Feiertag

Leider hast du Zweifelslos recht... Ich habe heute einen Denkfehler gemacht.
Mitglied: 130834
130834 Dec 11, 2016 updated at 19:17:03 (UTC)
Goto Top
Sei nicht so gemein. Außerdem habe ich ganz klar erläutert worum es geht. Der Schnipsel sollte ein Beispiel darstellen, da er genau wie die Funktion aufgebaut ist in der ich einen Fehler hatte. Wie auch immer hat der unfehlbare mikrotik am Ende doch recht gehabt und den Fehler aufgelöst.... Obwohl ich der Sache mit dem Errorlevel immer noch nicht traue. Das mit : weiß ich natürlich ugh. Es geht ja darum das die Meldung die ausgespuckt wird wenn der Task NICHT gefunden wird ein : enthält und alle anderen Meldungen nicht; weshalb es theoretisch ein Trick ist.
Eigentlich ist das jetzt aber auch nicht mehr so wichtig.

Edit:

Und was für ein Quatsch ist das Bitte:

Das Schnipsel tut was es soll. Fürs Telefonieren ist das nicht gedacht oder gebaut.
Überhaupt nicht tut das Schnipsel was es soll, wenn es nicht das tut wofür es gebaut wurde, haha. Sehr lustig mit dem Telefon. Wie schon gesagt sollte es die Abfrage nach einem Laufenden Programm per exe-Name demonstrieren, und das hat es ganz klar und deutlich NICHT getan.
Member: Pjordorf
Pjordorf Dec 11, 2016 at 20:31:21 (UTC)
Goto Top
Hallo,

Zitat von @130834:
Obwohl ich der Sache mit dem Errorlevel immer noch nicht traue.
Du brauchst nichts oder niemanden Trauen. Probiere es aus und wenn beide Batches korrekt sind, wirst du mit oder ohne dein ErrorLevel das Identische Ergebniss haben, damit ist das ErrorLevel in dem Schnippsel überflüssig. In anderen schnippsel kann es schon notwendig sein.

Es geht ja darum das die Meldung die ausgespuckt wird wenn der Task NICHT gefunden wird ein : enthält und alle anderen Meldungen nicht; weshalb es theoretisch ein Trick ist.
Auch das kann ich nicht nachvollziehen oder gar bestätigen. Ein
tasklist /FI "PID eq !mpid! " /FI "STATUS eq running  
liefert dir eintweder eine oder mehrere Zeilen welche deiner beiden Filter entsprechen. Sollte jetzt als Ergebniss hier ein
INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.
stehen weil eben entweder kein Eintrag im ersten Filter oder im zweiten Filter mehr übrig bleibt, dann bring dein gesamter Schnippsel
tasklist /FI "PID eq !mpid! " /FI "STATUS eq running" | find ":"  
if %errorlevel% EQU 0 ( exit )
auch das gewünschte Etgebniss. Es macht Exit. Warum? Deine Tasklist Ausgabe liefert dir deine gewünschte Zeile mit seinen ":". Du macht eben jetzt ein Find in dieser Zeile. Das Ergebniss von Find ist auf jeden Fall Wahr (True) und somit ist auch die Rückgabe des Errorlevels korrekterweise ein "0". Somit macht deine IF ErrorLevel auch korrekt seine Arbeit. Wie gesagt das Schnippsel tut was es soll. Mag vielleicht nicht das sein was du wolltest, aber das ist ja etwas anderes face-smile

Wie schon gesagt sollte es die Abfrage nach einem Laufenden Programm per exe-Name demonstrieren, und das hat es ganz klar und deutlich NICHT getan.
Dein korrigiertes erstes Schnippsel und dein Zweites Schnippsel haben beide das getan was diese sollten, nicht zwingend was du eventuell wolltest.

Gruß,
Peter
Mitglied: 130834
130834 Dec 11, 2016 at 20:41:33 (UTC)
Goto Top
Dein korrigiertes erstes Schnippsel und dein Zweites Schnippsel haben beide das getan was diese sollten, nicht zwingend was du eventuell wolltest.
Das ist inkorrekt. SIe sollen genau das tun was ich WILL, weshalb dies eine falsch-Aussage ist. Sie tun folglich nicht was sie tun sollen, da dies nicht ist was ich will.
Darüber könnte man jetzt noch einiges streiten aber für was.

Auch das kann ich nicht nachvollziehen oder gar bestätigen. Ein
Wieso kannst du dies nicht bestätigen?
Was du ausgeführt hast ist das selbe was ich gesagt habe nur in lang. Wo ist da der unterschied?
Wenn der Task nicht gefunden wird wird eine Meldung ausgegeben in welcher ein : enthalten ist welches ich mit Find suche.
Falls dem so ist, und es gefunden wurde ist der errorlevel gleich 0 da es keinen Fehler gibt. Falls der Task aber gefunden wird enthält der output kein : folglich errorlevel 1.
Genau das selbe was du gesagt hast.
Ich sehe da nichts zum bestätigen oder nachvollziehen.
Member: Pjordorf
Pjordorf Dec 11, 2016 at 21:00:09 (UTC)
Goto Top
Hallo,

Zitat von @130834:
Sie tun folglich nicht was sie tun sollen, da dies nicht ist was ich will.
Dann musst du deine Batches auch so scheiben das die dann tun was du willst. Und nein, Batches haben kein eigenleben.

Ich sehe da nichts zum bestätigen oder nachvollziehen.
Und was willst du jetzt? Deine Batch macht genau das für was die geschrieben ist. Ob das deinen Erwartungen entspricht ist etwas ganz anderes. Sie tut was sie soll. Vielleicht soll die Batch ja demnächst ein Flugzeug bauen - falls es das ist was du von deiner Batch erwartest (dein Wille...). Aber trotzdem tut die Batch das was die soll. Das was du willst und das was die Batch tut muss ja nicht übereinstimmen, aber deine Batch tut was die soll (zumindest so wie die geschrieben da steht).

Gruß,
Peter
Mitglied: 130834
130834 Dec 11, 2016 at 21:54:13 (UTC)
Goto Top
Ich bin zu faul dir einen text darüber zu schreiben;
Wie du ein Auto baust welches nicht fährt du willst aber das es fährt, aber das nicht-fahren ist nicht was das Auto tun SOLL sondern was es TUT weil du es FALSCH gebaut hast. Deswegen ist das noch lange nicht was es SOLL. Siehst du wie das keinen Sinn macht was du gesagt hast?
Und nebenbei fliegt dein Auto nicht. Aber dein Wille war das es fährt. Tut es aber nicht. Also tut es nicht was es soll und so weiter und so weiter.
Und ich hab trotzdem nen Text geschrieben. Aber wenigstens keinen schön formatierten, aufgebauten und durchdachten.
Stimmt trotzdem. Wenn du das letzte Wort haben willst offeriere ich es dir hiermit.
Bitte im Voraus.

lg clragon
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 Comments