|
|
Zum Einschlafen höre ich immer gerne mal einen guten langen Ambient Musikmix auf youtube oder in einem
Internetradio. Nur leider hat mein PC keinen Sleep Timer, also einen Einschlaftimer zum automatischen
Herunterfahren. Dachte ich bis jetzt, doch weit gefehlt, unter Windows gibt es die Shutdown.exe, damit
kann man den PC eben doch automatisch, auch zeitverzögert wie eben mit einem Sleeptimer, herunterfahren.
Doch diese Datei will mit ein paar speziellen Parametern angesprochen werden, sonst geht da gar nix.
Da es aber viel zu umständlich ist, die Shutdown.exe Datei jedes mal wieder mit den selben oder auch
anderen Parametern aufzurufen kann man entweder eine der vielen, im Internet angebotenen Shutdown
Programme die als Sleeptimer mit Benutzereingabe fungieren sollen herunterladen und sich dabei immer wieder fragen,
ob diese Datei wirklich nur den PC nach einer Zeit herunterfährt, oder ob der Programmierer da vielleicht
doch noch zusätzliche Funktionen eingebaut hat, und man auf dem eigenen PC ungebetenen Besuch bekommt.
Der Quellcode dieser mini Dateien ist meist nie offen zugänglich und man weiß nie woran man ist.
Viel offener ist in diesem Fall eine Batch Datei, mit der man unter Windows schon seit vielen vielen
Jahren zuverlässig Aufgaben automatisieren und auch eine Datei mit Parametern ansprechen kann.
Die Stapelverarbeitung in der Batch Datei führt eigentlich nur Befehle der Kommandozeile nacheinander aus.
Doch das klingt alles viel wilder, als es eigentlich ist.
Wie man mit den Mitteln einer Batchdatei und der Windows Shutdown.exe einen Sleeptimer mit Benutzereingabe
bastelt werde ich in diesem Artikel und Batch Coding Tutorial nun ausführlich erklären.
Wenn dir der ganze Text und die wahnsinnig interessanten Erklärungen und Erläuterungen zur Batch Programmierung mit Beispiel vollkommen egal
sind, solltest du am besten gleich zur fertigen Batch Datei springen. Es lohnt sich
aber mal über alles drüber zu lesen, auch du kannst da sicher noch was über das Batch Datei schreiben lernen...
Wollen wir uns also als erstes mal die verschiedenen Parameter der Shutdown.exe unter Windows anschauen. Du kannst
dir die Dateiparameter einfach anzeigen lassen, indem du in die Kommandozeilen Eingabe shutdown schreibst. Das Kommandozeilen Fenster
öffnest du indem du auf das Windows Symbol (oder auf den Startbutton bei älteren Windows Versionen) klickst und in die Zeile,
in der der Cursor blinkt,
und neben der eine nette Lupe zu sehen ist cmd schreibst und mit Enter bestätigst.
Das Kommandozeilen-Fenster, auch Shell genannt, öffnet sich.
Da schreibst du dann einfach shutdown rein und drückst nochmal Enter um die Eingabe zu bestätigen.
Das Programm shutdown.exe braucht Parameter, also passiert nichts, wenn du es einfach so
aufrufst, es zeigt dir sogar die Hilfe an. Da steht dann folgendes:
Shutdown.exe Parameter Hilfe
Syntax: shutdown [-i | -l | -s | -r | -g | -a | -p | -h | -e] [-f] [-m \Computer][-t xxx][-d [p:]xx:yy [-c "Kommentar"]]
Keine Argumente Zeigt Hilfe an. Dies entspricht -?
-i Zeigt eine grafische Benutzeroberfläche an. Dies muss die erste Option sein.
-l Abmelden. Dies kann nicht mit den Optionen -m oder -d verwendet werden.
-s Fährt den Computer herunter.
-r Fährt den Computer herunter und startet ihn neu.
-g Fährt den Computer herunter und startet ihn neu. Nach dem Neustart werden die registrierten Anwendungen neu gestartet.
-a Bricht das Herunterfahren des Systems ab. Diese Option kann nur während der Zeitüberschreitungsperiode verwendet werden.
-p Schaltet den lokalen Computer ohne Zeitlimitwarnung aus. Kann mit den Optionen -d und -f verwendet werden.
-e Dokumentiert die Ursache für das unerwartete Herunterfahren eines Computers.
-m \Computer legt den Zielcomputer fest.
-t xxx Legt die Zeitüberschreitungsperiode vor dem Herunterfahren fest. Gültiger Bereich: 0-315360000 (10 Jahre), der Standardwert ist 30. Wenn der Zeitüberschreitungswert größer ist als 0, wird der Parameter /f einbezogen.
-c "Kommentar" Kommentar bezüglich des Neustarts bzw. Herunterfahrens. Es sind maximal 512 Zeichen zulässig.
-f Erzwingt das Schließen ausgeführter Anwendungen ohne Warnung. Der Parameter -f wird einbezogen, wenn ein Wert größer als 0 für den Parameter -t angegeben wird.
-d [p|u:]xx:yy Gibt die Ursache für den Neustart oder der Herunterfahren an.
Und dazu kommen dann noch einige Codes, die uns in diesem Fall aber wirklich nicht sonderlich interessieren.
Für uns interessant sind die Parameter -s zum Herunterfahren und -t für die Zeitverzögerung.
Und am besten noch -f für das erzwungene Beenden aller aktiven Anwendungen, nur um sicher zu gehen.
Aber Vorsicht mit dem Parameter -f, benutze diesen nur, wenn du diesen Sleep Timer wirklich als Sleep Timer
zum Musikhören oder Ähnlichem benutzt. Wenn du diese Batch Datei benutzt während du noch was arbeitest,
dann fährt die shutdown.exe mit -f Parameter, wenn es soweit ist, deinen PC
schonungslos und rücksichtslos runter und fragt nichtmal ob du deine letzten Änderungen speichern möchtest,
also Vorsicht! Wenn noch irgendwelche Anwendungen im Hintergrund laufen, die im Normalfall das Herunterfahren verhindern, killt der -f Parameter diese
natürlich auch, deswegen ist der Parameter in dieser Beispiel Batch Datei drin, da wir annehmen, dass niemand mehr am Computer arbeitet oder davor sitzt,
um alle möglichen Fragen, ob man diese und jene Anwendung wirklich ganz sicher echt beenden möchte zu beantworten.
Der Parameter -f bewirkt auch, dass beim Shutdown von Windows keine Windows Updates installiert werden, da einfach alles schonungslos
heruntergefahren wird. Wenn du das jeden Tag machst, bekommst du jeden Tag keine Updates, es sei denn du lässt einfach den Parameter -f weg.
Thx Simon
Um Windows immer nach der selben Zeitdauer herunterzufahren sollte es also reichen eine Batchdatei mit folgendem Inhalt zu erstellen:
Shutdown.exe -s -t xxx -f
Wobei xxx die Zeit bis zum Shutdown in Sekunden ist.
Doch falls du technisch nicht so versiert bist und dich gerade fragst, was eigentlich eine Batch Datei ist,
und wie du eigentlich eine Batch Datei anlegst, dann lies dir einfach das folgende Kapitel durch, danach sollten keine Fragen
mehr offen sein...
Wenn du weißt, wie man eine Batch Datei erstellt, dann kannst du dieses Kapitel locker überspringen...
In eine Batchdatei schreibst du eigentlich nur nacheinander die Befehle rein, die du eben nacheinander ausführen möchtest. Und
in diesem Fall übernimmt die Batch Datei bei einmaligem Aufrufen dies für dich und führt eben die von dir
gewünschten und in die Batch Datei geschriebenen Befehle nacheinander aus.
Aber wie erstellt man nun so eine Batch Datei auf dem eigenen Windowssystem?
Je nachdem wo du die Shutdowndatei haben möchtest, ich bevorzuge direkt auf dem Desktop, es geht aber natürlich auch in einem beliebigen Ordner,
klickst du mit der rechten Maustaste (Rechtsklick) an diese Stelle und wählst Neu > Textdokument.
Gib der Datei einen aussagekräftigen Namen, wie zum Beispiel shutdown.txt, dann öffnest du dieses neu erstellte
Textfile mit dem standard Texteditor, schreibst die Befehle,
die ausgeführt werden sollen hinein und speicherst die Datei ab. In diesem Fall reicht wohl erstmal
Shutdown.exe -s -t 1800 -f
Nach dem Speichern schließt du die Datei im Editor. Wähle sie aus, und drücke F2 oder wähle über das Kontext Menü per Rechtsklick umbenennen aus.
Du änderst nun die Dateiendung von .txt in .bat. Das war's dann auch schon wieder.
Wenn du diese Datei nun ausführst wird dein PC in 30 Minuten heruntergefahren (also in 1800 Sekunden). Jedes Mal, wenn du
sie ausführst, auch morgen wieder. Diese halbe Stunde sollte erstmal reichen um hier panisch weiterzulesen um herauszufinden, wie man den
unvermeidlichen Shutdown nun vielleicht doch wieder abbricht.
Um die Datei unter älteren Windows Systemen wieder bearbeiten zu können musst du sie wieder in Shutdown.txt umbenennen und sie dann mit dem Editor öffnen. Viele gute
Editoren, wie zum Beispiel Notepad++ (kostenlos) oder
UltraEdit (kostet) können auch Batchdateien zum Bearbeiten öffnen ohne sie auszuführen und ohne, dass du die Dateiendung
ändern musst. Um die Batchdatei unter Windows 7 & 8 (eventuell auch Vista, unter XP geht es auf jeden Fall noch nicht) mit dem normalen Text Editor öffnen und weiterbearbeiten zu können reicht ein Rechtsklick
auf das .bat File und dann wählst du den Menüpunkt Bearbeiten. In einem der gerade genannten Editoren arbeitet es sich leichter, aber für die batch Datei Erstellung reicht
auch das Windows interne Notepad, mit welchem das File in dem Fall geöffnet wird. Um den Bearbeiten Menüpunkt im Windows Kontextmenü mit einem
anderen Editor zu verknüpfen musst du in der Windows Registry Werte verändern, aber das zu Erklären übersteigt den Umfang dieses bereits sehr umfangreichen Tutorials.
Die bereits genannten, besseren Editoren haben ohnehin einen eigenen
Eintrag im Rechtsklick-Kontextmenü...
Wenn du gar nicht wissen willst, wie das alles funktioniert und einfach nur eine funktionierende Batch Datei haben möchstest um deinen Windows PC
nach einer selbst bestimmten Zeitspanne automatisch herunterzufahren springe einfach zur fertigen Batchdatei. Ich kann manchmal sehr
ausführlich werden und für manche funktioniert das besser als Einschlafhilfe als ein Sleep Timer oder entspannte Musik...
Dann mal los, bauen wir also langsam die Batch Datei auf. Als erstes solltest du die Batch Datei anlegen,
dann öffne diese mit einem Editor und mach dich bereit diese zu bearbeiten.
Als erstes schreiben wir in die erste Zeile
@echo off
Damit werden die ausgeführten Befehle nicht nochmal angezeigt und es sieht einfach besser aus.
Wenn aber mal was angezeigt wird wollen wir das in einer coolen Farbe die wohl auch an Matrix erinnert anzeigen. Dazu schreiben wir vollkommen optional folgendes in
das Batchfile
color 0A
Die erste Zahl ist die Hintergrundfarbe, ein dunkles, schwarzes Schwarz, symbolisiert durch die Ziffer 0.
Die Schriftfarbe wird durch den zweiten Hexwert gesetzt, in diesem Fall ein helles Grün.
Wenn du lieber ein bisschen ein dunkleres Grün haben möchtest, dann nimmst du besser 02 als Farbe.
Wenn du es ganz genau wissen willst, hier eine kleine Farbtabelle zur Übersicht:
Nun wollen wir den Benutzer fragen wie lange er denn warten möchte bis zum Shutdown, quasi der Final Countdown. Dazu brauchen wir eine Variable
in der wir die Eingabe speichern und außerdem eine Frage. Das könnte dann so ausssehen
echo Wie lange denn noch? set /p min=Zeit in Minuten:
Set setzt oder verändert Variablen. Um eine Benutzereingabe in einer Variablen zu speichern benötigen wir den Parameter /p
zusätzlich zum set Befehl.
Ohne den Parameter /p kann man nur Variablen im Script setzen. Aber wir wollen ja selbst, mit der Eingabe eines Werts bestimmen, wann abgeschaltet wird.
Unsere Variable,
in der wir die Benutzereingabe speichern, bekommt nun den Namen min (wie Minuten, nicht wie Minimalwert oder sowas...).
Da die Shutdown.exe aber nur eine Zeiteingabe in Sekunden annimmt, und eine Eingabe in Sekunden das ganze Konzept
vom einfach zu bedienenden Sleeptimer in die Tonne treten würde, müssen wir diese Eingabe nun umrechnen
set /a zeit = %min%*60
Wenn man mit Variablen rechnet oder diese in einem Text anzeigen möchte, muss man sie zwischen 2 % Zeichen schreiben,
und zum Setzen der Variablen benötigt der set Befehl den Parameter /a.
Mit dieser einfachen Zeile rechnen wir die eingegebenen Minuten in Sekunden um und speichern das Ergebnis in der Variable zeit,
um damit dann die Shutdown.exe zu füttern, sollte klar sein...
Nun können wir auch schon die Shutdown.exe mit den ganzen Parametern aufrufen
shutdown.exe -s -t %zeit% -f
Mit ein paar Erweiterungen haben wir also folgenden Scriptcode
@echo off color 0A
echo Wie lange denn noch? set /p min=Zeit in Minuten: set /a zeit = %min%*60 echo shutdown in %min% Minuten pause shutdown.exe -s -t %zeit% -f
Mit dem Befehl pause muss der Benutzer erst noch eine Taste drücken, ehe der Shutdown Befehl tatsächlich ausgeführt wird.
Wenn man es sich in der Zwischenzeit doch anders überlegt hat, kann man einfach das Fenster zumachen und nichts passiert.
Es wird ja auch irgendwann kalt, wenn man ständig das Fenster offen hat...
Das sollte nun schon funktionieren, wenn man alles vernünftig bedient.
Aber das reicht uns noch nicht. Wenn man zum Beispiel einfach nichts eingibt und bestätig, bekommt man einen Fehler.
Für diesen Fall müssen wir die Eingabe überprüfen,
und wenn nichts eingegeben wird nochmal nachfragen. Dafür brauchen wir eine Sprungmarke und eine Prüfbedingung
:start echo Wie lange denn noch? set /p min=Zeit in Minuten:
if not defined min ( echo. echo bitte gib doch was ein... echo. goto start )
Mit dem Doppelpunkt definieren wir die Sprungmarke. In der Bedingung testen wir ob eine Eingabe erfolgte,
und falls nicht, geben wir einen Text aus,
der dies bemängelt und rumquengelt und springen wieder zur Eingabe.
Mit echo. schreibt man eine leere Zeile in die Ausgabe. Das sieht einfach besser aus.
Mit goto springt man zu der Sprungmarke mit dem Namen der hinter dem goto kommt.
Nun wollen wir mal eben testen, ob die Eingabe auch wirklich eine positive Zahl ist. dazu schreiben wir unter den ersten Prüfblock folgendes
if %min% LEQ 0 ( echo. echo lass es ein bisschen mehr sein... echo. goto start )
Mit dem Operator LEQ testen wir ob %min% kleiner oder gleich Null ist. LEQ steht für LEss or eQual. Wenn wir auch Null als
Eingabe zum sofortigen Shutdown akzeptieren möchten, benutzen wir den Operator LSS, das steht natürlich für LeSS.
Falls dies tatsächlich der Fall ist, und der Benutzer den PC in der Vergangenheit herunterfahren möchte sagen wir ihm, dass dies nicht so einfach geht,
da der Fluxkompensator gerade kaputt ist, und springen wieder zur Eingabe am Anfang zurück.
Nun kann es natürlich noch sein, dass der Benutzer ein totaler Blindgänger ist und Buchstaben oder sonstige Zeichen als Eingabe verwendet. Was also tun?
Hier hilft uns ein kleiner Trick, wir schreiben noch was vor die Überprüfung
set /a min = %min%*1
if %min% LEQ 0 ( echo. echo lass es ein bisschen mehr sein... echo. goto start )
Falls min eine Zahl ist, ist alles okay, eine Zahl mit 1 multipliziert bleibt die gleiche Zahl,
aber wenn min irgendwas anderes als eine Zahl ist, ergibt die Multiplikation mit 1 eben 0.
Und genau danach suchen wird ja in unserer Bedingung und verweigern die Annahme. In diesem Fall ist aber das LEQ als Prüfbedingung
natürlich besser als LSS, da sonst bei irgend einer Eingabe 0 herauskommt und dadurch sofort der Shutdown ausgeführt wird.
Das wird ja immer besser und funktioniert einwandfrei!
Doch halt. Was, wenn man es sich tatsächlich anders überlegt und den Countdown abbrechen möchte?
Um den Shutdown zu stoppen müssen wir eigentlich nur shutdown.exe -a aufrufen. Und da wir sehr clever sind, bauen wir das Abbrechen
des Herunterfahrens nun noch als Funktion in das Script ein. Dafür braucht es erstmal eine kleine Änderung
set /a test = %min%*1
if %test% LEQ 0 ( if %min% == a ( goto cancel ) echo. echo lass es ein bisschen mehr sein... echo. goto start )
Wir speichern das Ergebnis der Prüfung ob Zahl oder nicht in einer anderen Variable, die wir test nennen, und prüfen dann die tatsächliche Eingabe,
ob sie a wie
abort oder abbrechen ist. Wir können auch auf jede andere Buchstabenkombination testen um den Shutdown abzubrechen,
aber a bietet sich an, da dieser Buchstabe eben auch der Abbruch-Parameter der shutdown.exe ist.
Nun müssen wir noch eine Sprungmarke zum Abbrechen des Countdowns, und was dort passiert in das Script einbauen.
:cancel echo. echo SleepTimer abbrechen? pause shutdown.exe -a
Die Abbruch Sprungmarke kommt ganz ans Ende, hinter den Shutdown-Befehl mit der Zahlenvariable. Somit überspringen wir den Aufruf der Shutdown.exe mit
Zeitparametern und beenden einen bereits gestarteten Shutdown Vorgang.
Nur unser Script hat nun noch einen Fehler. Wenn jetzt eine Zahl, also eine valide Zeit eingegeben
wird, wird shutdown.exe gestartet und danach kommt das Script, das einfach jeden Befehl Schritt für Schritt, Zeile für Zeile ausführt,
zu unserer neuen Sprungmarke (:cancel) am Ende und führt den Code dahinter auch noch aus und beendet somit gleich wieder den Shutdown.
Also müssen wir verhinden, dass das Script im Fall einer validen Zeiteingabe überhaupt soweit kommt und
nach dem Teil, der für den Shutdown mit Zeitparametern verantwortlich ist, einfach die Ausführung des Scripts
beenden. Und dafür gibt es einen einfachen Befehl
shutdown.exe -s -t %zeit% -f exit
Mit exit beenden wir einfach das Script und alles was danach kommt wird nicht mehr ausgeführt,
also wird der Shutdownvorgang auch nicht gleich
wieder abgebrochen, sondern nur, wenn man den Buchstaben a eingibt, springt das Script zur Sprungmarke hinter der der Befehl zum
Abbruch des Shutdown Vorgangs gegeben wird.
Noch ein kleiner Tipp:
Wenn du nach einiger Zeit merkst, dass du immer wieder die selbe Zeit eingibst, nach der der PC abschalten soll,
dann kannst du den Block mit dem die leere, nicht definierte Eingabe verarbeitet wird zu deinem Vorteil
bearbeiten und dort drin eben einfach deine Zeit setzen und diese somit einfach
mit Enter eingeben, ohne eine Zahl tippen zu müssen. Das sieht dann einfach so aus
if not defined min ( set /a min = 60 )
Die 60 ist nur ein Beispiel für 60 Minuten, also eine Stunde, du kannst da natürlich jede Zahl und
Zeitdauer reinschreiben die dir passt. Mach das aber nur, wenn sich die Zeit für dich bewährt hat,
sonst kannst du ja mit einer fehlerhaften Eingabe aus Versehen eine Zeit die du gar nicht willst einstellen.
Die Abfrage ob die Benutzereingabe überhaupt sinnvoll ist, ist selbst natürlich auch schon sinnvoll
und wird mit dieser optionalen Codeänderung außer Kraft gesetzt.
Wie alles in der richtigen Reihenfolge und komplett zusammengebastelt aussieht siehst du im nächsten Kapitel.
So sieht dann also das komplette File von Innen aus, wie du daraus eine Batch-Datei machst, steht in
Kapitel 2 - Batch-Datei erstellen. Wenn dir selbst das zu umständlich ist und du so gar nichts über
die spannende Batch Programmierung
lernen möchtest und einfach nur das File haben möchtest, kannst du es dir hier herunterladen. (647 bytes, md5: af5838a38618d49af582aef9237e3af0)
Wenn dein Shutdown Countdown läuft und du es dir doch anders überlegst kannst du die Batchdatei nochmal
aufrufen und mit a diesen bereits gestarteten Shutdownvorgang abbrechen.
Und das kleine Programm kann sogar rechnen, also kannst du 4*60 eingeben und das Programm berechnet dir eben wie viele Minuten 4 Stunden haben :)
@echo off color 0A
:start echo Wie lange denn noch? set /p min=Zeit in Minuten:
if not defined min ( echo. echo bitte gib doch was ein... echo. goto start )
set /a test = %min%*1
if %test% LEQ 0 ( if %min% == a ( goto cancel ) echo. echo lass es ein bisschen mehr sein... echo. goto start )
set /a zeit = %min%*60 echo Shutdown in %min% Minuten pause shutdown.exe -s -t %zeit% -f exit
:cancel echo. echo SleepTimer abbrechen? pause shutdown.exe -a
Viel Spaß damit!
Wenn du tatsächlich Spaß haben solltest und nach dieser langen Lektüre immer noch nicht eingeschlafen bist, lass mir doch einen Kommentar noch tiefer hier drunter da.
Letztes Update: 2019-02-15
|
schrieb am: 2013-05-03 16:51:58
Genau das habe ich gesucht um meinem PC mit batchdatei zeitverzögert herunterzufahren. Und dann auch noch so ausführlich erklärt! Echt top!
schrieb am: 2014-10-25 11:16:42
schrieb am: 2015-04-20 00:41:09
schrieb am: 2015-07-29 09:27:19
schrieb am: 2015-08-28 20:12:00
Und was muss ich angeben, wenn ich möchte dass Windows dann auch gleich vorhandene Updates installiert?
schrieb am: 2015-08-29 13:43:09
schrieb am: 2015-09-01 07:41:55
schrieb am: 2015-11-10 16:14:59
schrieb am: 2015-12-07 01:50:56
Das hat mir lange schon gefehlt
schrieb am: 2015-12-09 22:57:07
schrieb am: 2016-01-06 23:00:48
schrieb am: 2016-01-21 22:26:51
schrieb am: 2016-02-06 05:39:53
schrieb am: 2016-08-10 05:13:47
Der Parameter -f wird einbezogen, >>> wenn ein Wert größer als 0 für den Parameter -t <<< angegeben wird.
schrieb am: 2016-08-12 17:59:05
schrieb am: 2016-08-15 04:35:51
schrieb am: 2017-12-04 00:12:32
schrieb am: 2019-10-28 19:21:36
schrieb am: 2020-01-20 14:25:49
gibt es die möglichkeit in einer zeitschleife (-s -t 3600) ca. 1bis 2 min vorher ein kommentar einzublenden (PC wird in zwei minuten heruntergefahren)
schrieb am: 2021-04-15 20:34:16