Programm über CMD-Befehl beenden

kluth-family

Lieutenant
Dabei seit
Apr. 2005
Beiträge
806
Guten Morgen,
mit einem externen Programm (Xecutor), das bei Win7 über die Aufgabenplanung geladen wird und deutlich mehr Möglichkeiten als die Aufgabenplanung bietet, sichere ich u.a. mit der Freeware "MailStoreHome" zwei E-Mail Konten. Dummerweise geht bei der Freeware ein Fenster nach Beendigung der ersten Sicherung auf, das mit Klick auf "Beenden" geschlossen werden muss, erst dann startet die zweite Sicherung bzw. erst dann kann man das Programm erneut starten.
Da ja das ganze automatisch laufen soll und ich diesen Klick-Befehl vermeiden will, habe ich im Ablauf nach der ersten Sicherung den Befehl "Taskkill.cmd" mit dem Inhalt "Taskkill mailstorehome.exe" eingebunden, siehe Pic1.
Aber leider läuft das in einer Endlosschleife immer weiter, siehe Pic2.

Starte ich den "Taskkill.cmd" Befehl manuell mit Administratorenrechten, klappt das einwandfrei. Da aber das eigentliche Programm Xecutor, was beim Win7 Start die eingetragenen Programme abarbeiten soll, ebenfalls mit "höchsten Privilegien" startet und somit die Rechte an alle eingetragenen Programme vererbt, verstehe ich nicht, warum es zu dieser Endlosschleife kommt.

Nochmal zum Verständnis, für den Fall, das ich mich schräg ausgedrückt habe: Das Programm Xecutor macht nichts anderes, als beim Win7 Start alle einegtragenen Programme in der Reihenfolge ihres Eintrages abzuarbeiten, man kann auch noch einstellen, ob bestimmte Programme nur einmal täglich ausgeführt werden sollen, oder zu nur zu einer bestimmten Uhrzeit usw., also deutlich mehr Komfort bei der Einstellung als die Windows eigene Aufgabenplanung, wenn da nicht diese Endlosschleife wäre...

Kann mir da jemand weiterhelfen?
Ist vielleicht die Syntax mienes "Taskkill.cmd" Befehles fehlerhaft?
 

Anhänge

  • Pic1.JPG
    Pic1.JPG
    16,5 KB · Aufrufe: 457
  • Pic2.JPG
    Pic2.JPG
    86,5 KB · Aufrufe: 1.210
Hi,

also eine weitere mögliche Lösung wäre die Verwendung von Autoit. Damit lassen sich Programme erstellen, die z.B. im Hintergrund warten bis ein bestimmtes Fenster aufgeht und dann einen Button drücken. Das ist mit AutoIT also gar kein Problem.

Finden kannst du es hier: http://www.autoitscript.com/autoit3/downloads.shtml

Bei Fragen kann ich dir auch ein wenig helfen.

Gruß
Fr4g3r
 
Hi,
hört sich auch gut an, werde ich heute Abned mal checken.

Wenn ich es richtig verstehe, könnte ich deinem genannten Programm also beibringen, das es, wenn meine Anwendung beendet wird und das Fenster mit dem Button "Schliessen" aufgeht, dann also ohne mein zutun den "Schliessen" Button quasi drücken würde?
 
genau, das funktioniert damit.
Als Beispiel für einen Quellcode:

WinWaitActive("Titel deines Fensters", "Text innerhalb deines Fensters")

ControlClick ("Titel deines Fensters", "Text innerhalb deines Fensters"", "Button1")

Die Button-ID, also das Button1, bekommst mit dem Programm AutoIt Window Info heraus, welches beim Autoit-Paket dabei ist.

Gruß
Fr4g3r
 
Zuletzt bearbeitet:
OK, das sieht im Moment noch alles was schwierig aus. Mit WindowInfo bekomme ich das angezeigt (Summary):

>>>> Window <<<<
Title:
Class: WindowsForms10.Window.8.app.0.378734a
Position: 66, 419
Size: 598, 368
Style: 0x16CF0000
ExStyle: 0x00010180
Handle: 0x000000000005060C

>>>> Control <<<<
Class: Internet Explorer_Server
Instance: 1
ClassnameNN: Internet Explorer_Server1
Advanced (Class): [CLASS:Internet Explorer_Server; INSTANCE:1]
ID:
Text:
Position: 0, 27
Size: 582, 257
ControlClick Coords: 473, 34
Style: 0x56000000
ExStyle: 0x00000000
Handle: 0x0000000000130874

>>>> Mouse <<<<
Position: 547, 506
Cursor ID: 0
Color: 0xFFFFFF

>>>> StatusBar <<<<

>>>> Visible Text <<<<
bevelLine1
Kopieren
Drucken...
Debugprotokoll
Schließen
Mozilla Thunderbird Standard-Benutzer


>>>> Hidden Text <<<<


Es geht um den "Schließen" Button, siehe >>>>Visible Text<<<<.

Wie und womit geht es jetzt weiter?
Es gibt da diverse Script Editoren im Programmverzeichnis, Run Script, Run Script (x86) und SciTE Script Editor ???
 
Hi,

also du startest das Window Info, dann klickst du auf das Fenster in dem du beenden drücken willst das dieses aktiv ist und fährst mit der Maus über den Beenden Button. Dann drückst dann ctrl+alt+f. Damit frierst du die Informationen im Window info ein. Jetzt siehst du die Informationen zum Fenster und zum Button.

l0LnjAf3YVso4cK.jpg


Jetzt weist du also der Titel von meinem Fenster ist ausführen und der Button hat die Instance 2.

Der code wäre damit z.B.:

WinWaitActive("ausführen")

ControlClick ("ausführen", "", "Button2")

Schreiben kannst du diese Scripte im SciTE Script Editor. Dort kannst du sie dann auch compilieren und es wird eine .exe draus.

Gruß
fr4g3r
 
Hi,
Die Ermittlung mit Windows Info hat geklappt, jetzt bin ich mir aber nicht mehr ganz sicher, ob ich unter "Basic Window Info" beim "Titel" überhaupt was drinne stehen hatte, aus der Erinnerung heraus meine ich, das bei mir nur Info´s unter "Basic Control Info" gestanden hätten. Prüfe ich aber noch mal.

Sehe ich es richtig, das dann im weiteren Verlauf der Befehl

WinWaitActive("Mein Button")

bewirkt, das geprüft wird, ob eine Box mit dem Button "MeinButton" überhaupt aktiv ist, also so eine Art Timerfunktion, und wenn die Aktivität festgestellt wird, dann wird unmittelbar der gewünschte Button gedrückt?

Beendet sich denn diese mit Autoit erzeugte EXE selbstständig, nachdem der Button erkannt und gedrückt wurde?

Fragen über Fragen, das ganze erinnert ja auch stark an Programmierung. Hab vor Jahren mal eine bisschen in Visual Basic reingeschaut, bin da aber nie richtig weiter gekommen.
Daher auch erstmal vielen Dank für deine Unterstüzung hier. :):):)
 
Hi,

also:
WinWaitActive überwacht immer nach dem Titel des Fensters, nicht nach dem Namen eines Buttons.
Hier die genaue Funktion:
http://www.autoitscript.com/autoit3/docs/functions/WinWaitActive.htm

Du musst also zunächst den Titel angeben und falls du keinen hast, dann einen Inhalt der im Fenster steht. z.B:

WinWaitActive("","Wollen sie wirklich abbrechen?")

Die .exe schließt sich, sobald sie einmal den Button gedrückt hat. Wenn du das nicht willst, dann musst du mit einer While-Schleife arbeiten. Dann schließt sich das Programm nicht.

Also z.B.

While 1

sleep(1000)
WinWaitActive("ausführen")
sleep(1000)
ControlClick ("ausführen", "", "Button2")

Wend

Jetzt läuft das Programm dauernd weiter und checkt alle 1000ms (1s) ob ein Fenster mit dem von dir genannten Inhalt oder Titel aktiv wird und drückt dann 1s später den Button 2. Immer und immer wieder.

Gruß
Fr4g3r
Ps: Ja, Autoit ist eine Programmiersprache, bzw. damit lässt sich programmieren.
 
Zuletzt bearbeitet:
Hi,
also das Erstellen des Scripts und das Erzeugen der EXE hat geklappt. Dieses besagte Fenster hat -wie heute morgen schon vermutet- keinen Title, es funktioniert aber auch mit der Angabe eines der Inhalte des Fensters.
Screenshot der Box und des AuoIt Window Info anbei.

Das Script sieht übrigens so aus:

WinWaitActive ("","Schließen")
ControlClick ("","Schließen","WindowsForms10.BUTTON.app.0.378734a4")


Aber nu kommt es:

Die aus dem Script erzeugte EXE habe ich mal einfach BoxEnd.exe genannt.
In diesem Autostart Tool wird auch zunächst die BoxEnd.exe gestartet, dann startet das MailStoreHome Programm und zum Schluss geht das Fenster auf, das auf dem Screenshot zu sehen ist und...bleibt so stehen wie es ist. Es verschwindet erst, wenn ich dieses Fenster an irgendeiner Stelle mit der Maus anklicke und es so anscheinend für meine BoxEnd.exe auf "Aktiv" setze.
Da schließe ich im Moment mal draus, dass das Fenster zwar sichtbar ist, aber anscheinend für die BoxEnd.exe erstmal so nicht, wie gesagt, einmal mit der Maus irgendwo ins Fenster (nicht auf den "Schließen" Button !!!) und dann erst erfüllt BoxEnd.exe ihren Zweck und das Fenster verschwindet blitzschnell und damit ist die erste Instanz von MailStoreHome auch wie gewünscht endgültig beendet.
Kann man die automatische Aktivierung des Fensters auch irgendwie erfassen oder liegt der Fehler schon vielleicht im Script?
 

Anhänge

  • Pic1.JPG
    Pic1.JPG
    74,9 KB · Aufrufe: 325
Zuletzt bearbeitet:
Hi,

das sieht ja schon mal nicht schlecht aus.
Am einfachsten wäre jetzt eine While Schleife zu setzen die das überprüft.
Probier mal bitte folgenden Code, ob er funktioniert:

While 1
sleep(1000)
WinActivate("", "Schließen")
WinWaitActive ("","Schließen")
ControlClick ("","Schließen","WindowsForms10.BUTTON.app.0.378734a4")
WEnd

Gruß
fr4g3r
 
Moin,
damit erreiche ich, das auch auch das vermeindliche nicht aktive Fenster erkannt wird?
Und die mit deinem Beispiel-Script erstellte Exe würde sich auch nach getaner Arbeit selbstständig beenden?

Werde es heute Abend auf jeden Fall mal checken...thx mal wieder!
 
Dein Batch-Script läuft in einer Endlosschleife, weil du es genauso genannt hast wie den Befehl, den du ausführen willst, nämlich "taskkill" bzw. "taskkill.cmd". Die ruft sich damit immer selbst auf.

Edit: Achso, die Syntax in deinem Script sollte lauten "TASKKILL /F /IM mailstorehome.exe".
 
Zuletzt bearbeitet:
Nabend,
sehr, sehr schwere Geburt.
Also, das letze Script von dir funktioniert vom Prinzip her.

Auf dem beigefügten screenshot siehts du, was ich in diesem Programm Xecutor der Reihe nach starte. Zunächst dein Script, was als EXE dann BoxEnd_201109 heißt.
Danach zweimal Mailstorehome, wobei man zu jedem gestarteten Programm auch noch die Möglichkeit hat, bestimmte Sachen einzustellen, siehe rechte Seite screenshot.
Lasse ich es so laufen, startet Mailstorehome zweimal hintereinander, und beim zweiten Start kommt natürlich während der Laufzeit der ersten Instanz die Meckermeldung, das Mailstorehome bereits aktiv ist.
Belege ich nun die erste Instanz mit dem Häckchen "Warten bis Programm beendet", dann läuft die erste Instanz Mailstorehome bis zum Ende durch incl. des nervigen Fensters, welches automatisch weggeklickt werden soll. Passiert aber leider dann nicht automatisch, erst wieder, wenn ich mit der Maus über das Fenster fahre.
Lasse ich dagegen Mailstorehome nur einmal laufen(um zu vermeiden, dass das Prog zweimal gestartet wird) und entferne das Häckchen bei "Warten bis Programm beendet", geht zum Schluss exakt das gleiche nervige Fenster auf, nur das es dann direkt automatisch verschwindet.

In beiden Fällen sieht das Fenster meiner Meinung nach wirklich gleich aus, nur einmal wird es durch BoxEnd...exe erkannt und beim anderen mal nicht.


Nachtrag:
Also dieses besagte Fenster, welches automatisch geschlossen werden soll, scheint von einer ganz besonderen Art zu sein...
hab mal mit Autoit den Befehl "Mouseclick" probiert, bedeutet, ich hab den Mauszeiger automatisch zu der Stelle "Schließen" des Fensters fahren und einen Doppelklick ausführen lassen (Mouseclick "left", 1077, 663,2). Nix passiert das Fenster bleibt offen!
Erst wenn ich wirklich händisch mit der Maus auf den Schließen Button fahre und doppelklicke, dann schließt sich das Fenster.
Wahrscheinlich werde ich irgendwie schauen, das ich das ganze anders regele.
Alles andere scheint fast unlösbar zu sein bzw. endet in viel zu viel Aufwand.
In der Hoffnung, das dir dazu noch was einfällt und ich nicht langsam anfange, zu nerven, verbleibe ich zunächst mal mit freundlichen Grüßen

Nachtrag 2
Hab mir am Wochende mal die ganzen Befehle von Autioit näher angeschaut.
Hab es jetzt mit diesem Script hinbekommen:

While 1
Sleep(1000)
If WinExists ("[CLASS:WindowsForms10.Window.8.app.0.378734a]","")Then ControlClick ("","Schließen","WindowsForms10.BUTTON.app.0.378734a4")
WEnd


Das Problem war anscheinend, dass das besagte Fenster erstmal nicht auf Aktiv steht und mit dem o.g. Script prüfe ich nun einfach, ob es lediglich vorhanden ist.
Eine Frage aber noch: kann ich in o.g. Script eigentlich einbauen, das sich das Script bzw. die aus dem Script reszultierende Exe selbstständig beendet, z.B. ProcessClose oder so was?
Oder kann ich ein Programm im Programm selbst nicht beenden und es bedarf einer separaten Exe, die den Prozess beende?
 

Anhänge

  • Pic2.JPG
    Pic2.JPG
    145,5 KB · Aufrufe: 302
Zuletzt bearbeitet: (Nachtrag)
Zurück
Top