Interessantes (?) Problem mit Powershell und msg-Befehl
Hallo zusammen,
ich habe hier ein Backup-Skript in Powershell zusammengeklöppelt (bin da blutiger Anfänger, eigentlich ist eher die Bash mein Metier), welches per Aufgabenplanung täglich im Hintergrund (als User SYSTEM) ausgeführt werden soll.
Ich verwende darin den msg-Befehl, um dem jeweils gerade angemeldeten Benutzer Meldungen (v.a. 'Bitte Backup-Platte anschließen' + 'Backup fertig, Platte bitte wegschließen') zu präsentieren - ja, ich weiß, 'msg' ist eigentlich ein CMD/Batch-Befehl, aber prinzipiell funktioniert das erstmal, z.B. wie folgt:
Aus sich mir bislang nicht erschließenden Gründen funktioniert das aber anscheinend nur beim ersten Aufruf im Powershell-Skript (ggf. auch mehrfach - der Aufruf steckt in einer do-until-Schleife, bis eben die Platte angeschlossen wurde).
Aber beim (ursprünglich) zweiten Aufruf im Code ('Backup fertig, Platte bitte wegschließen') flackert nur kurz etwas über den Bildschirm, wenn überhaupt - das Benachrichtigungsfenster erscheint nicht wirklich, der Benutzer kann dementsprechend nicht OK klicken, das Skript läuft laut der Aufgabenplanung weiterhin (im Taskmanager allerdings nicht immer!?), und vor allem: der Benutzer hat nicht mitbekommen, dass das Backup fertig ist, mit der Konsequenz das er den Laptop weder wegbewegen noch runterfahren kann...
Nun habe ich, um den Kopf frei zu kriegen von der Frage was da wohl los ist und wie ich das behebe, zwischendurch einen Zähler in die "Bitte Platte anschließen"-Schleife eingebaut, der nach der dritten Aufforderung die Backupplatte anzuschließen mit einer weiteren msg-Meldung a la "Na dann halt morgen wieder" abbricht - mit dem Ergebnis, dass nun der bisher funktionierende msg-Aufruf nicht mehr erscheint, sondern nur der Bildschirm/Desktop kurz flackert (und zwar 3 mal!), und dann aber das "Dann morgen wieder"-Fenster erscheint!?!
Es scheint bislang so, als würde nur das erste 'Start-Process [...] msg' ausgeführt zu werden bzw. vernünftig zu funktionieren - und zwar nicht der erste Aufruf im Programmfluss, sondern der erste in der Skriptdatei niedergeschriebene msg-Aufruf?!
Syntaktisch sind die Aufrufe identisch, einziger Unterschied ist nur der Inhalt der jeweils anzuzeigenden Nachricht...
Ist übrigens die Backupplatte bereits angeschlossen zum 'geplante-Aufgabe'-Startzeitpunkt, läuft das Backup soweit durch, der Programmfluss kommt gar nicht an den beiden msg-Aufrufen (Platte-anschließen + Dann-eben-nicht) vorbei, aber dennoch flackert auch hier am Ende des (erfolgreichen!) Backups nur etwas auf dem Bildschirm; das msg-Benachrichtigungsfenster taucht nicht auf (bzw. bleibt nicht lange genug, um es zu sehen geschweige denn dort OK zu klicken), und die Aufgabe läuft laut Verwaltung weiterhin, oft/meist ohne verbleibenden Prozess im Taskmanager...
Nun habe ich dazu also 2, 3 Fragen:
Write-Host und ähnliche Cmdlets scheinen -soweit ich es verstanden habe- nur Meldungen in der Powershell-Konsole auszugeben, welche bei Ausführung als geplanter Aufgabe ja nun mal gar nicht sichtbar ist; schon gar nicht für den normalerweise angemeldeten, unprivilegierten Standardbenutzer des Gerätes...
Hier das vollständige Skript: pastebin.com/ASKzXJQc - falls das yemandem hilft...
ich habe hier ein Backup-Skript in Powershell zusammengeklöppelt (bin da blutiger Anfänger, eigentlich ist eher die Bash mein Metier), welches per Aufgabenplanung täglich im Hintergrund (als User SYSTEM) ausgeführt werden soll.
Ich verwende darin den msg-Befehl, um dem jeweils gerade angemeldeten Benutzer Meldungen (v.a. 'Bitte Backup-Platte anschließen' + 'Backup fertig, Platte bitte wegschließen') zu präsentieren - ja, ich weiß, 'msg' ist eigentlich ein CMD/Batch-Befehl, aber prinzipiell funktioniert das erstmal, z.B. wie folgt:
Start-Process -Wait -FilePath 'msg' -ArgumentList '*',
'/W',
'Bitte die Backup-USB-Platte anschließen, und dann dieses Fenster wegklicken'
Aus sich mir bislang nicht erschließenden Gründen funktioniert das aber anscheinend nur beim ersten Aufruf im Powershell-Skript (ggf. auch mehrfach - der Aufruf steckt in einer do-until-Schleife, bis eben die Platte angeschlossen wurde).
Aber beim (ursprünglich) zweiten Aufruf im Code ('Backup fertig, Platte bitte wegschließen') flackert nur kurz etwas über den Bildschirm, wenn überhaupt - das Benachrichtigungsfenster erscheint nicht wirklich, der Benutzer kann dementsprechend nicht OK klicken, das Skript läuft laut der Aufgabenplanung weiterhin (im Taskmanager allerdings nicht immer!?), und vor allem: der Benutzer hat nicht mitbekommen, dass das Backup fertig ist, mit der Konsequenz das er den Laptop weder wegbewegen noch runterfahren kann...
Nun habe ich, um den Kopf frei zu kriegen von der Frage was da wohl los ist und wie ich das behebe, zwischendurch einen Zähler in die "Bitte Platte anschließen"-Schleife eingebaut, der nach der dritten Aufforderung die Backupplatte anzuschließen mit einer weiteren msg-Meldung a la "Na dann halt morgen wieder" abbricht - mit dem Ergebnis, dass nun der bisher funktionierende msg-Aufruf nicht mehr erscheint, sondern nur der Bildschirm/Desktop kurz flackert (und zwar 3 mal!), und dann aber das "Dann morgen wieder"-Fenster erscheint!?!
Es scheint bislang so, als würde nur das erste 'Start-Process [...] msg' ausgeführt zu werden bzw. vernünftig zu funktionieren - und zwar nicht der erste Aufruf im Programmfluss, sondern der erste in der Skriptdatei niedergeschriebene msg-Aufruf?!
Syntaktisch sind die Aufrufe identisch, einziger Unterschied ist nur der Inhalt der jeweils anzuzeigenden Nachricht...
Ist übrigens die Backupplatte bereits angeschlossen zum 'geplante-Aufgabe'-Startzeitpunkt, läuft das Backup soweit durch, der Programmfluss kommt gar nicht an den beiden msg-Aufrufen (Platte-anschließen + Dann-eben-nicht) vorbei, aber dennoch flackert auch hier am Ende des (erfolgreichen!) Backups nur etwas auf dem Bildschirm; das msg-Benachrichtigungsfenster taucht nicht auf (bzw. bleibt nicht lange genug, um es zu sehen geschweige denn dort OK zu klicken), und die Aufgabe läuft laut Verwaltung weiterhin, oft/meist ohne verbleibenden Prozess im Taskmanager...
Nun habe ich dazu also 2, 3 Fragen:
- Warum ist das so bzw. was passiert hier? (Und (wie) kann ich das beheben?)
- Außerdem ist mir ja klar, dass 'msg' vermutlich eh nicht sooo Powershell-Best-Practice sein wird
- gibt es alternativ ein Cmdlet, mit welchem ich dasselbe erreichen kann/sollte?
Write-Host und ähnliche Cmdlets scheinen -soweit ich es verstanden habe- nur Meldungen in der Powershell-Konsole auszugeben, welche bei Ausführung als geplanter Aufgabe ja nun mal gar nicht sichtbar ist; schon gar nicht für den normalerweise angemeldeten, unprivilegierten Standardbenutzer des Gerätes...
Hier das vollständige Skript: pastebin.com/ASKzXJQc - falls das yemandem hilft...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1921927007
Url: https://administrator.de/forum/interessantes-problem-mit-powershell-und-msg-befehl-1921927007.html
Ausgedruckt am: 17.07.2025 um 17:07 Uhr
1 Kommentar
Moin.
Du schreibst hier zwar verständlich, aber viel zu viel.
Bitte reduziere dein Pastebin-Skript auf etwas, mit dem jeder hier arbeiten kann, um es zu reproduzieren.
Wie ich vorgehen würde: Sende dem Nutzer das Popup "bitte Platte anschließen"
Wenn er das dann tut, wird ja im Eventlog ein Event generiert wo steht "Platte mit ID sowieso ist jetzt bereit". An dieses Event solltest Du dann einen Task heften ("event based trigger"), der dann das Backup anfährt und am Schluss wieder eine Message "Backup fertig, Platte kann ab".
Du schreibst hier zwar verständlich, aber viel zu viel.
Bitte reduziere dein Pastebin-Skript auf etwas, mit dem jeder hier arbeiten kann, um es zu reproduzieren.
Wie ich vorgehen würde: Sende dem Nutzer das Popup "bitte Platte anschließen"
Wenn er das dann tut, wird ja im Eventlog ein Event generiert wo steht "Platte mit ID sowieso ist jetzt bereit". An dieses Event solltest Du dann einen Task heften ("event based trigger"), der dann das Backup anfährt und am Schluss wieder eine Message "Backup fertig, Platte kann ab".