Anzeige

Am Puls von Microsoft

Anzeige

[gelöst] Aufgabenplanung: Ereignis: "Programm geschlossen"

Winup

treuer Stammgast
Es gibt doch in der Aufgabenplanung diese "Ereignisse", die man als Trigger benutzen kann.

Ich möchte gerne ein Script starten, sobald ein Programm geschlossen wird. Es handelt sich nicht um ein bestimmtes Programm. Jedes Programm, das geschlossen wird (z.B. Excel, Editor, Rechner, usw.) soll diesen Trigger auslösen.

Frage:
Welches Protokoll im Aufgabenassistenten muss ich dazu auswählen. "System" vielleicht?
Und hinter welcher dieser zahlreicher Quellen verbirgt sich das Ereignis "Programm geschlossen"?

Eine Lösung würde mich freuen.

Vielen Dank.
 
Anzeige
in deinem Profil steht Windows 10, hier schreibst du unter Windows 7?
Sorry, richtig, Windows 10. Windows 7 ist in meiner VM. Und für diese brauche ich den Ereignis-Trigger.

was soll der Trigger denn bewirken?
Es soll eine Powershell ausgeführt werden, sobald ein Programm geschlossen wird. Die Powershell soll prüfen, ob noch weitere Programme geöffnet sind. Wenn nicht, soll die VM heruntergefahren werden. Diesen Teil habe ich schon einigermassen. Jetzt fehlt mir noch das Trigger-Ereignis.
 
Zuletzt bearbeitet:
Da habe ich einen anderen Vorschlag:
Starte die zu überwachenden Programme über eine Batchdatei statt direkt. Also ungefähr so:

Programmname.bat
Code:
Programmname.exe
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -File "<Pfad>\<skriptname>.ps1"
 
Danke @Porky. Das könnte ein guter Vorschlag sein.

Ist es möglich, die beiden Zeilen
HTML:
Programmname.exe
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -File "<Pfad>\<skriptname>.ps1"
in eine Zeile zu bringen?

Also so was wie:
HTML:
Programmname.exe  & %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -File "<Pfad>\<skriptname>.ps1"
 
Müsste gehen. Aber nimm && statt & (der zweite Befehl wird nur ausgeführt, wenn der erste Befehl erfolgreich war).
 
Also: Wenn ich das genau so mache, wie Du es beschrieben hast, dann geht es. Powershell wartet mit der Ausführung, bis das Programm geschlossen ist.

Ich will aber aus dem Host direkt den Befehl in die cmd schreiben und nicht über den Zwischenschritt einer Batch-Datei gehen. Sonst muss ich für jedes Programm eine Batchdatei schreiben.

Wenn ich jetzt testweise den Befehl mal in ein cmd-Fenster eingebe, dann passiert aber das:
siehe Bild <Zulassung 2>

Im Help steht, man müsse die *.ps1 zuerst "zulassen" (mit Rechtsklick auf die Datei).
Das habe ich aber bei mir nicht gefunden:
siehe Bild <Zulassung 1>
 

Anhänge

  • Zulassen2.png
    Zulassen2.png
    16,9 KB · Aufrufe: 242
  • Zulassen1.png
    Zulassen1.png
    54,4 KB · Aufrufe: 258
Hm, da startet sofort nach Befehlseingabe die Powershell und der erste Teil wird gar nicht ausgeführt. Die ganze Zeile wird falsch interpretiert. Aber warum? Jetzt bin ich auch erst einmal ratlos. Mit nur einem & hast du sicherlich schon probiert?
Wenn ich das unter Windows 10 starte, scheint das zu funktionieren. Die Dateien werden natürlich nicht gefunden (die illegalen Zeichen sind < und >):
Scheinbar verhält sich Windows 7 da anders.

Dann versuche ich mal Powershell:
Code:
$ProcessName = "calculator"
$Program = "calc.exe"
$CheckProcess = ""
$CheckProcess = Get-Process | Where-Object {$_.ProcessName -eq $ProcessName}
If($CheckProcess -eq $null){
<Hier dein Script ausführen>
}
else {
exit
}

Das in der Aufgabenplanung regelmäßig ausführen, z. B. alle 10 Minuten.
 

Anhänge

  • Eingabeaufforderung.png
    Eingabeaufforderung.png
    18,7 KB · Aufrufe: 249
Zuletzt bearbeitet:
Danke.

Ja, wenn es nicht anders geht...


Als Alternative zu Deinem Script in #8 hätte ich noch folgendes Powershell Script-Bruchstück:
HTML:
tasklist /V | findstr "Running"

Hier erhalte ich eine Liste aller laufenden Programme.

Offenbar kennst Du dich aus mit Powershell.
Wie muss ich den Befehl verändern, damit ich an Stelle einer Liste eine Zahl erhalte. Nämlich aus wie vielen Listeneinträgen die Liste besteht?

(So könnte man ja dann überprüfen, ob noch Programme offen sind. Nämlich dann wenn die Liste eine bestimmte Anzahl Einträge überschreitet.)
 
Oha, eigentlich bin ich gar nicht so der Powershell Freak. Ich muss immer eine Dokumentation dazu offen haben. Aber warte mal...

Versuche mal
Code:
tasklist /V | findstr "Running" | Measure-Object | %{$_.Count}
 
Zuletzt bearbeitet:
Anzeige
Oben