netzwerkdude
Goto Top

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):

$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
    }
}

Content-Key: 382710

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

Printed on: May 22, 2024 at 00:05 o'clock

Member: SeaStorm
Solution SeaStorm Aug 08, 2018 at 12:27:50 (UTC)
Goto Top
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

$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
Member: NetzwerkDude
NetzwerkDude Aug 08, 2018 at 12:41:32 (UTC)
Goto Top
Die .WaitForExit() Methode sollte passen, danke!
Member: emeriks
Solution emeriks Aug 08, 2018 at 12:58:29 (UTC)
Goto Top
Hi,
wäre es nich "schicker", das Konsolenfenster auszublenden und stattdessen ein Formular anzuzeigen? Bei diesem könnte man dann ganz einfach über einen Eventhandler auf das (versuchte) Schließen des Formulars reagieren.

E.
Member: colinardo
Solution colinardo Aug 08, 2018 updated at 13:20:44 (UTC)
Goto Top
Servus.
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
oder
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
Member: NetzwerkDude
NetzwerkDude Aug 08, 2018 at 13:30:36 (UTC)
Goto Top
Das wäre viel schicker, aber da bin ich zu faul immer GUIs zu basteln face-smile
Member: NetzwerkDude
NetzwerkDude Aug 08, 2018 at 13:33:01 (UTC)
Goto Top
Register-ObjectEvent und Register-EngineEvent sehen auch interessant aus, muss ich mal bei gelegenheit irgendwo einbauen zum testen, danke
Member: Bem0815
Bem0815 Aug 08, 2018 at 13:48:26 (UTC)
Goto Top
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.