
130834
15.01.2017
Herunterfahren erkennen (Batch)
Hallo Leute
Ich war gerade am experimentieren mit 40'000 Dateien und mehr, und da dachte ich mir;
Was passiert wenn Windows oder der Benutzer plötzlich auf die Idee kommt den Computer herunterzufahren?
Ja. Dann passiert eine Menge Drama auf einmal, denn normalerweise werden Batch-Files einfach umgebracht.
Nach etwas Google habe ich herausgefunden, das Windows beim Herunterfahren ein Signal an die laufenden Anwendungen sendet.
War ja klar. Irgendwie mussten die es ja auch herausbekommen.
Das Event heißt dann "WM_QueryEndSession".
Jetzt würde mich interessieren ob ich mit meiner Batch oder ein Paar Bordmitteln
herausfinden kann ob Windows gerade ein "herunterfahren" gestartet hat.
Dann könnte ich den aktuellen Task der Batch abbrechen,
oder zumindest eine Variable speichern um beim wieder hochfahren weiterzuarbeiten.
Und wenn wir gerade dabei sind;
Wie bringe ich meine Batch am besten dazu auf das Signal zu hören, während sie die Dateien verarbeitet?
Freue mich auf Antworten
lg clragon
Ich war gerade am experimentieren mit 40'000 Dateien und mehr, und da dachte ich mir;
Was passiert wenn Windows oder der Benutzer plötzlich auf die Idee kommt den Computer herunterzufahren?
Ja. Dann passiert eine Menge Drama auf einmal, denn normalerweise werden Batch-Files einfach umgebracht.
Nach etwas Google habe ich herausgefunden, das Windows beim Herunterfahren ein Signal an die laufenden Anwendungen sendet.
War ja klar. Irgendwie mussten die es ja auch herausbekommen.
Das Event heißt dann "WM_QueryEndSession".
Jetzt würde mich interessieren ob ich mit meiner Batch oder ein Paar Bordmitteln
herausfinden kann ob Windows gerade ein "herunterfahren" gestartet hat.
Dann könnte ich den aktuellen Task der Batch abbrechen,
oder zumindest eine Variable speichern um beim wieder hochfahren weiterzuarbeiten.
Und wenn wir gerade dabei sind;
Wie bringe ich meine Batch am besten dazu auf das Signal zu hören, während sie die Dateien verarbeitet?
Freue mich auf Antworten
lg clragon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 326486
Url: https://administrator.de/forum/herunterfahren-erkennen-batch-326486.html
Ausgedruckt am: 21.04.2025 um 10:04 Uhr
17 Kommentare
Neuester Kommentar
Batch kann das nicht.
In einer Programmiersprache (oder PowerShell) könntest du das Event abfangen und darauf reagieren.
Ein sehr simples beispiel: https://stackoverflow.com/questions/10174075/powershell-window-preventin ...
In einer Programmiersprache (oder PowerShell) könntest du das Event abfangen und darauf reagieren.
Ein sehr simples beispiel: https://stackoverflow.com/questions/10174075/powershell-window-preventin ...

Oder per PS das Eventlog überwachen
Wird langsam Zeit das du dir mal eine vernünftige Programmiersprache aneignest
. Man kann sich auch mit einer Schrotflinte von hinten durchs Auge schießen.
Das ist ja nicht mehr mit anzusehen was verkrüppelte Lösungen du da mit Bat2Exe etc. bastelst ...
Lernen müssen wir unser Leben lang, also fang an du wirst Batch mit seinen diversen Unzulänglichkeiten schnell nicht mehr vermissen.
JustMy2Cent
Gruß mik
$query = New-Object System.Diagnostics.Eventing.Reader.EventLogQuery("System",[System.Diagnostics.Eventing.Reader.PathType]::LogName,"*[System[(EventID=109) and (Provider[@Name='Microsoft-Windows-Kernel-Power'])]]")
$watcher = New-Object System.Diagnostics.Eventing.Reader.EventLogWatcher($query, $null, $false)
Register-ObjectEvent -InputObject $watcher -SourceIdentifier "NewEventLogWatcher" -EventName 'EventRecordWritten' -Action {write-host "Shutdown is initiated."}
$watcher.Enabled = $true
while($true){
sleep .5
}
Das ist ja nicht mehr mit anzusehen was verkrüppelte Lösungen du da mit Bat2Exe etc. bastelst ...
Lernen müssen wir unser Leben lang, also fang an du wirst Batch mit seinen diversen Unzulänglichkeiten schnell nicht mehr vermissen.
JustMy2Cent
Gruß mik

Aber die frage ist, was genau macht der code da oben? xD
Es überwacht das Eventlog auf den Shutdown-Event. Hier im Beispiel wird nur die Meldung "Shutdown is initiated."........-Action {write-host "Shutdown is initiated."}
auf der Konsole ausgegeben wenn ein Shutdown eingeleitet wurde, das kannst du ersetzen durch was immer du auch willst
Es bringt mir nix wenn ich den shutdown erkenne ohne die Erkennung benutzen zu können .
Code lesen, dann siehst du wo du handeln musst Ausserdem! Ich benutze Bat2Exe nur um meine Tools zu bündeln
So das jeder Virenscanner schiss bekommt und deine Skripte gleich in die Tonne befördert 
Zitat von @130834:
Aber was soll man dann benutzen? Um den Code selber zu schreiben bin ich noch zu doof.
Wenn zusammenpacken dann z.B. mit WinRAR oder 7Zip eine selbst extrahierende EXE erstellen. Dann hast du auch nicht das Problem das Fragmente nach deinem Skript übrig bleiben denn die löschen das automatisch nach dem Ausführen (lässt sich konfigurieren).Aber was soll man dann benutzen? Um den Code selber zu schreiben bin ich noch zu doof.
Allemal besser C#/AutoIt etc. lernen und gleich eine richtige EXE ohne Abhängigkeiten kompilieren. Das .NET bietet alles was du brauchst.
Ein Meister ist noch nie aus dem Himmel gefallen, jeder fängt mal an, nur muss man halt mal anfangen
nur wie verbinde ich das mit einer batch die gerade in einer FOR Schleife läuft?
Zum Beispiel eine Statusdatei schreiben und auf Existenz in der Batch prüfen, ... arghhh was für ein Bullshit Batch ... kein MultiThreading nix ... hör mir damit auf da stellen sich einem die Haare.
Schwebt nur Zentimeter vor meiner Nase aber ich bin mit sowas wie DOS ( päh ) beschränkt
Never say no, it's never too late. mit sowas wie DOS ( päh ) beschränkt
d.h. im Kerker des Grauens der 80er eingesperrt 
Zitat von @130834:
Was hältst du von der Entscheidung C++ zu lernen?
Auf jeden Fall wenn du eine gehörige Portion Zeit hast dann absolut ja. Aber ich kenne deine Lernfähigkeit ja nicht. Wenn du dich so zwingen musst eine Sprache zu lernen wirst du aber mit C/C++ für den Einstieg nicht glücklich.Was hältst du von der Entscheidung C++ zu lernen?
Ich find die Sprache ganz nett, C# ist zwar eine gute Idee
aber etwas umständlich geraten, meiner Meinung nach.
Die Verbreitung sagt was anderes, ist Geschmackssache, ich finds i.O.aber etwas umständlich geraten, meiner Meinung nach.
C++ läuft auch ganz gut auf Android, die möglichkeiten damit kann ich aber nicht abschätzen.
Alles ist möglich nur braucht es mit C++ halt etliche Zeit bis du Lernerfolge erzielst, und du musst eine gehörige Portion Frustrationsbereitschaft mitbringen.Ich möchte eine gehörige Protion Datei managment haben,
Bei C# hat ein Kollege welche das lernt sowas wie "Dateimanagement" nie gefunden.
c# beruht auf dem .NET Framework und dort hast du alle Möglichkeiten die auch Powershell bietet, also eine ganze Menge!Bei C# hat ein Kollege welche das lernt sowas wie "Dateimanagement" nie gefunden.
Vielleicht ist auch einfach nur der Fokus anders.
Definitiv ja.Wichtig ist das du die gängigen Strukturen kennen lernst. Dann steigst du schnell auf andere Sprachen um, ist ja dann nur wie Vokabeln lernen.
Das wird zwar ganz schön off-topic, aber naja ...
C vs. C++
Die beiden haben zwar eine ähnlich Syntax, bedienen aber andere Programmierparadigmen, sodass sie unterschiedlicher nicht sein könnten.
C ist relativ schnell gelernt. Die Standardfunktionen sind überschaubar. Die Speicherverwaltung liegt aber voll in deinen Händen. Das ist, was C letztlich schwer, umstädlich und fehleranfällig macht. Die Programmierschnittstelle für POSIX (*nixoide Betriebssysteme) und die Windows API sind im C-Stil aufgebaut, haben aber ansonsten nichts mit C zu tun. Das heißt an dieser Stelle hört die plattformunabhängigkeit von C auf.
Mit C++ hast du mit Speicherverwaltung weniger Probleme. Es gibt ausreichend Containerklassen wo du dir darüber keine Gedanken machen musst. C geht aus Kompatibilitätsgründen fast vollständig in C++ auf. Das heißt C lernst du mehr oder weniger mit, wenn du C++ lernst. Die APIs von *nix und Windows lassen sich auch aus C++ bedienen. C++ ist aber viel komplexer als C. Insbesondere wenn du bisher nur mit Batch zu tun hattest, erfordert eine objektorientierte Sprache erst mal ein komplettes Umdenken.
Häufiges Missverständnis: Eine Reihe von Computerspielen sind mit C++ geschrieben, sodass viele glauben grafische Oberflächen würden von C++ unterstützt werden. Das ist nicht der Fall. Grafische Benutzeroberflächen gehören weder zum C, noch zum C++ Standard. Entsprechende Drittbibliotheken wrappen nur die APIs der unterschiedlichen Betriebssysteme, sind aber untereinander nicht kompatibel.
C#
Viel kann ich dazu nicht beitragen. Wie mik schon sagte, dir steht das .NET Framework vollumfänglich zur Verfügung. C# ist objektorientiert, also ist da auch erstmal Verstehen und Umdenken angesagt. Grafik wird unterstützt, dafür legst du dich aber auf Windows fest (mal abgesehen vom Mono Projekt, bei dem versucht wird das ganze portierbar zu machen).
Java
Sieht C# ähnlich, funktioniert aber anders. Hier bekommst du nur einen vorkompilierten Bytecode als Programm. Plattformunabhängig wird das durch die Java Virtual Machine, die du für das entsprechende Betriebssystem installieren musst und die diesen Bytecode interpretiert.
Am Ende bleibt, dass unterschiedliche Programmiersprachen für unterschiedliche Anwendungszwecke mal mehr und mal weniger geeignet sind. So etwas wie die "beste" Programmiersprache gibt es nicht. Alle halbwegs populären Programmiersprachen haben ihre Daseinsberechtigung. Neben dem Anwendungszweck ist maximal noch die Syntax einer Sprache ein Auswahlkriterium. Dem einen liegt was C-artiges mehr, der anderen steht auf eine Basic- oder Pascal-artige Syntax. Sprachen wie C, C++, C#, Java, PHP, ... haben aber syntaktische Gemeinsamkeiten. Am Ende ist das aber nicht kriegsentscheidend. Wie mik schon gesagt hat, das ist wie Vokabeln lernen. Die Sprache selbst ist nur ein kleiner Teil von dem, was Programmieren ausmacht. Der größere und wichtigerer Teile ist, zu lernen wie man mit einer Sprache zur Problemlösung kommt, also wie man Struktur und entsprechende Algorithmen aufbaut, um zum Ziel zu gelangen.
Grüße
rubberman
C vs. C++
Die beiden haben zwar eine ähnlich Syntax, bedienen aber andere Programmierparadigmen, sodass sie unterschiedlicher nicht sein könnten.
C ist relativ schnell gelernt. Die Standardfunktionen sind überschaubar. Die Speicherverwaltung liegt aber voll in deinen Händen. Das ist, was C letztlich schwer, umstädlich und fehleranfällig macht. Die Programmierschnittstelle für POSIX (*nixoide Betriebssysteme) und die Windows API sind im C-Stil aufgebaut, haben aber ansonsten nichts mit C zu tun. Das heißt an dieser Stelle hört die plattformunabhängigkeit von C auf.
Mit C++ hast du mit Speicherverwaltung weniger Probleme. Es gibt ausreichend Containerklassen wo du dir darüber keine Gedanken machen musst. C geht aus Kompatibilitätsgründen fast vollständig in C++ auf. Das heißt C lernst du mehr oder weniger mit, wenn du C++ lernst. Die APIs von *nix und Windows lassen sich auch aus C++ bedienen. C++ ist aber viel komplexer als C. Insbesondere wenn du bisher nur mit Batch zu tun hattest, erfordert eine objektorientierte Sprache erst mal ein komplettes Umdenken.
Häufiges Missverständnis: Eine Reihe von Computerspielen sind mit C++ geschrieben, sodass viele glauben grafische Oberflächen würden von C++ unterstützt werden. Das ist nicht der Fall. Grafische Benutzeroberflächen gehören weder zum C, noch zum C++ Standard. Entsprechende Drittbibliotheken wrappen nur die APIs der unterschiedlichen Betriebssysteme, sind aber untereinander nicht kompatibel.
C#
Viel kann ich dazu nicht beitragen. Wie mik schon sagte, dir steht das .NET Framework vollumfänglich zur Verfügung. C# ist objektorientiert, also ist da auch erstmal Verstehen und Umdenken angesagt. Grafik wird unterstützt, dafür legst du dich aber auf Windows fest (mal abgesehen vom Mono Projekt, bei dem versucht wird das ganze portierbar zu machen).
Java
Sieht C# ähnlich, funktioniert aber anders. Hier bekommst du nur einen vorkompilierten Bytecode als Programm. Plattformunabhängig wird das durch die Java Virtual Machine, die du für das entsprechende Betriebssystem installieren musst und die diesen Bytecode interpretiert.
Am Ende bleibt, dass unterschiedliche Programmiersprachen für unterschiedliche Anwendungszwecke mal mehr und mal weniger geeignet sind. So etwas wie die "beste" Programmiersprache gibt es nicht. Alle halbwegs populären Programmiersprachen haben ihre Daseinsberechtigung. Neben dem Anwendungszweck ist maximal noch die Syntax einer Sprache ein Auswahlkriterium. Dem einen liegt was C-artiges mehr, der anderen steht auf eine Basic- oder Pascal-artige Syntax. Sprachen wie C, C++, C#, Java, PHP, ... haben aber syntaktische Gemeinsamkeiten. Am Ende ist das aber nicht kriegsentscheidend. Wie mik schon gesagt hat, das ist wie Vokabeln lernen. Die Sprache selbst ist nur ein kleiner Teil von dem, was Programmieren ausmacht. Der größere und wichtigerer Teile ist, zu lernen wie man mit einer Sprache zur Problemlösung kommt, also wie man Struktur und entsprechende Algorithmen aufbaut, um zum Ziel zu gelangen.
Grüße
rubberman
Unterstützt Java denn GUI?
Ja.Unterstüzt C++ / C alle Plattformen?
Die Frage müsste eher umgekehrt lauten, aber ja, alle gängigen.Was ist den der große Unterschied zwischen Objektorientierten Programmiersprachen und Batch ähnlichen welche nur von oben nach unten laufen?
Programmierparadigmaaber mikrotik hat ja gesagt zum Einsteigen ungeeignet.
Unsinn. Batch ist mit keiner anderen Sprache vergleichbar. Also musst du sowieso neu lernen. Wie gesagt, C++ ist eine objektorientierte Sprache, genau wie C#. Vom Schwierigkeitsgrad IMHO völlig egal auf welche du umsteigst. Da du aber auf Klickibunti stehst und sogar versucht hast Batch zu einem GUI umzupolen, hast du dieselben Probleme mit C++. Wenn du mittelfristig bei Windows bleiben willst, dann ist C# wohl die bessere Wahl für dich. Ist aber nur eine Vermutung, da ich nicht weiß was genau du eigentlich alles programmieren willst. Wie oben schon gesagt, sind verschiedene Sprachen auf bestimmte Anwendungsgebiete getrimmt und eignen sich dann dafür besser als andere. Webanwendungen macht man eher nicht mit C und Desktopanwendungen nicht mit PHP ...Grüße
rubberman
*geschafft
Genau genommen nicht. Weder ist es wirklich ein GUI, noch ist es Batch gewesen, was es "geschafft" hat. Eher waren es die elfundneunzig Zusatztools, die in Sprachen geschrieben wurden, die so etwas "schaffen" Aber es ist dumm zu denken,
das ein User fähig genug wäre einen Dateipfad in einen Prompt mit der > Aufforderung "Enter Path"
einzugeben und das richtig zu verwenden.
So ist es. Selbst für einen Filebrowser ist Batch also schon ungeeignet. Du hast viel zu viel Energie reingesteckt ...das ein User fähig genug wäre einen Dateipfad in einen Prompt mit der > Aufforderung "Enter Path"
einzugeben und das richtig zu verwenden.
Batch ist gut als Arbeitstier um immer wiederkehrende Aufgaben zu automatisieren. Da kannst du das Fenster in die Taskleiste minimieren wo es dir ungestört die nächste Viertelstunde irgendwas stupides abnimmt. Dann kommt's auch nicht auf Performance an. Alles andere ist Spielerei, die schnell nervig wird.
Grüße
rubberman