Code ausführen sobald Powershell Fenster mit "X" zugemacht wird
Moin,
habe hier ein Skript für User das bestimmte Aufgaben erledigt, leider neigen die User dazu einfach das Fenster grafisch mit "X" zu schließen, statt es IM Skript zu beenden (dabei müssten Sie nur "Q" drücken)
Das Problem dabei: Wenn man das Fenster zuschießt, bleiben Dateien übrig da Sie nicht "ordentlich aufgeräumt werden".
Die Frage: Kann das Skript noch auf ein "X" auf das eigene Fenster noch reagieren (.CloseMainWindow()?) und es irgendwie abfangen?
Mein best guess war bisher, über einen zweiten Prozess das überwachen, aber irgendwie ist das sowohl unelegant, als auch ineffizient (je sekunde prüfen):
habe hier ein Skript für User das bestimmte Aufgaben erledigt, leider neigen die User dazu einfach das Fenster grafisch mit "X" zu schließen, statt es IM Skript zu beenden (dabei müssten Sie nur "Q" drücken)
Das Problem dabei: Wenn man das Fenster zuschießt, bleiben Dateien übrig da Sie nicht "ordentlich aufgeräumt werden".
Die Frage: Kann das Skript noch auf ein "X" auf das eigene Fenster noch reagieren (.CloseMainWindow()?) und es irgendwie abfangen?
Mein best guess war bisher, über einen zweiten Prozess das überwachen, aber irgendwie ist das sowohl unelegant, als auch ineffizient (je sekunde prüfen):
$Prozess = Start-Process powershell.exe 'C:\DerSollUeberwachtWerden.ps1' -PassThru
while ($true) {
if ($Prozess.HasExited) {
Write-Host "unterfenster wurde zugemacht, was machen"
Exit
}
else {
Write-Host "keine änderung festgestellt"
Start-Sleep 1
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 382710
Url: https://administrator.de/forum/code-ausfuehren-sobald-powershell-fenster-mit-x-zugemacht-wird-382710.html
Ausgedruckt am: 10.04.2025 um 17:04 Uhr
7 Kommentare
Neuester Kommentar
Hi
AFAIK kannst du nicht ordentlich darauf reagieren, wenn ein User auf das X drückt.
Ich hätte jetzt einen ähnlichen Weg wie du eingeschlagen und aus einem "Startscript" das eigentliche Script aufgerufen, aber mit
dann startet dein eigentliches Script in einem eigenen Prozess und es wird gewartet, bis dieser beendet wurde. Dann das Cleanup machen
AFAIK kannst du nicht ordentlich darauf reagieren, wenn ein User auf das X drückt.
Ich hätte jetzt einen ähnlichen Weg wie du eingeschlagen und aus einem "Startscript" das eigentliche Script aufgerufen, aber mit
$prozess= [System.Diagnostics.Process]::Start("powershell.exe", "-Parameter123")
$prozess.WaitForExit()
doCleanUp()
dann startet dein eigentliches Script in einem eigenen Prozess und es wird gewartet, bis dieser beendet wurde. Dann das Cleanup machen
Servus.
Asynchron geht es so:
oder
Wenn es eine UI wäre so wie @emeriks anmerkt würde ich auch das Fenster stattdessen verstecken.
Grüße Uwe
Asynchron geht es so:
$Prozess = Start-Process powershell.exe 'C:\DerSollUeberwachtWerden.ps1' -PassThru
Register-ObjectEvent $prozess -EventName Exited -SourceIdentifier 'ProcessClosed' -Action {
write-host "Do something"
} | out-null
Register-EngineEvent PowerShell.Exiting -Action { "Exiting $(Get-Date)" >> C:\TEMP\log.txt }
Wenn es eine UI wäre so wie @emeriks anmerkt würde ich auch das Fenster stattdessen verstecken.
Grüße Uwe
Soll das Fenster denn generell mit Q vom User geschlossen werden?
Falls nicht würde sich auch als Lösung noch anbieten das Script komplett unsichtbar laufen zu lassen.
Ich bin jetzt nicht 100% sicher ob das mit PS genau auf die gleiche Weise funktioniert, mit Batch ging das aber wie folgt:
Führe nicht das Batch selbst aus, sondern erstelle eine VB Script Datei welche das Batchfile aufruft.
Einfach mit dem Editor z.B. eine Script.vbs erstellen (hinterher sicherstellen das die Datei Script.vbs und nicht Script.vbs.txt heißt).
Folgende Zeilen müssen enthalten sein:
Set WshShell = WScript.CreateObject( "WScript.Shell" )
WshShell.Run "c:\beispiel.cmd",0,True
(Beispiel.cmd mit deiner Script Datei austauschen).
Wenn die VBS Datei gestartet wird, wird dein Script ausgeführt ohne das sich ein Kommandozeilen oder Powershell Fenster öffnen.
Falls nicht würde sich auch als Lösung noch anbieten das Script komplett unsichtbar laufen zu lassen.
Ich bin jetzt nicht 100% sicher ob das mit PS genau auf die gleiche Weise funktioniert, mit Batch ging das aber wie folgt:
Führe nicht das Batch selbst aus, sondern erstelle eine VB Script Datei welche das Batchfile aufruft.
Einfach mit dem Editor z.B. eine Script.vbs erstellen (hinterher sicherstellen das die Datei Script.vbs und nicht Script.vbs.txt heißt).
Folgende Zeilen müssen enthalten sein:
Set WshShell = WScript.CreateObject( "WScript.Shell" )
WshShell.Run "c:\beispiel.cmd",0,True
(Beispiel.cmd mit deiner Script Datei austauschen).
Wenn die VBS Datei gestartet wird, wird dein Script ausgeführt ohne das sich ein Kommandozeilen oder Powershell Fenster öffnen.