Frage deutsch
~~~~~~~~~~~~~~~~
Wie schalte ich das ATX-Netzteil aus?
Question English
~~~~~~~~~~~~~~~~
How to switch off the AT power supply from QB?
Antwort 1
~~~~~~~~~~~~~~~~
[ von Thomas Antoni Unter Verwendung von Ausschnitten aus der c't 2003/11,
Seite 198-201 ]
*** Vorbemerkungen von Thomas Antoni
Der folgende sehr informative c't-Artikel beschreibt, wie man über Batch -
Dateien Routine-Jobs automatisch ablaufen lassen und danach den PC-
herunterfahren kann. Anschließend sorgt das Batch-Programm dann für ein
Ausschalten des ATX - Netzteils. Der Anwender muss nur einmal den Batch starten
und kann dann Kaffetrinken oder in den Feierabend gehen.
Durch Verwendung des SHELL-Befehls sind alle angegebenen Problemlösungen auch
mit QBasic verwendbar.
Zum Herunterfahren von Windows 9x verwendest Du z.B. einfach den
Befehl
shell "rundll32 shell32,SHExitWindowsEx 1"
statt des im Artikel angegebenen Befehlls
rundll32 shell32,SHExitWindowsEx 1
*** Einführung
Häufig will man vor dem Herunterfahren von Windows den Computer noch einige
Routinejobs ausführen lassen, z.B. einen Virenscanner beauftragen oder ein
Daten-Backup durchführen. Angenehm wäre es, wenn man vorher schon den Computer
velassen und einer Batch-Datei die gesamte Arbeit inklusive dem Herunterfahren
des Systems übergeben könnte.
Dabei kann es sinnvoll sein, dass der Batch nach dem Aufruf eines Programms
erst dann weitermacht, wenn das Programm komplett abgearbeitet ist. Das
erreicht man durch Aufruf des jeweiligen Programms aus der Batch-Datei heraus
mit Start /w Programm.exe .
Aber wie kann nun das System herunterfahren und zu guter Letzt das
ATX-Netzteil durch den Batch auschalten lassen? Dazu wollen wir im Folgenden
einige Problemlösungen für die verschiedenen Windows-Versionen geben.
*** Windows 9x ausschalten
Unter Windows 9x gibt es keinen eigenständigen Befehl zum Herunterfahren von
Windows. Stattdessen kann man das Programm RunDLL32.exe zum Aufrufen einer
DLL-Datei nutzen, die mit dem passenden Parameter das Gewünschte erledigt.
Bei dem mit einem Komma - ohne Leerzeichen - angehängten Parameter achtet
Windows auf Groß-/Kleinschreibung. Das Kommando
rundll32.exe shell32.dll,SHExitWindowsEx 1
oder
rundll32 shell32,SHExitWindowsEx 1
oder
Rundll32.exe user,ExitWindows
sorgt dafür, dass Windows schlicht herunterfährt. Sollte sich der Rechner
trotz ATX-Netzteil danach nicht ausschalten, hilft vielleicht das Ändern der
angehängten Zahl auf 8.
(Anmerkung von Thomas Antoni: Unter meinem alten Windows 95A funktionierte
nur das 3. der oben angegebenen Kommandos)
Allerdings scheitert das, wenn noch Programme offen sind, die beipielsweise
auf das Speichern geöffneter Dokumente warten. Addiert man jedoch eine 4 zur
angehängten Zahl, fährt Windows ohne Rücksicht auf Verluste einfach
herunter.
Doch Vorsicht: Aus der Shutdown.bat wird leicht eine Art Shootdown.bat, denn
nicht gespeicherte Daten gehen dabei verloren. Deshalb ist es immer der bessere
Weg, vor dem Aufruf der Batch-Datei alle noch laufenden Anwendungen zu
beenden.
Die RunDLL.exe kann übrigens noch viel mehr, wie Du im FAQ-Eintrag
"Wie greife ich auf die Windows
Betriebssystemfunktionen zu?" nachlesen
kannst.
*** Windows XP ausschalten
Unter Windows XP ist kein kryptischer Befehl nötig. Stattdessen gibt es hier
ein Programm namens Shutdown.exe, das im Windows-Verzeichnis im Ordner System32
liegt. Damit es korrekt funktioniert, muss jedoch Service-Pack 1 installiert
sein - sonst schaltet sich der PC nach dem Herunterfahren nicht aus. Zum
sofortigen Herunterfahren von XP lautet das Kommando
shutdown -s -t 00
Die Zahl nach dem "-t" ist die Anzahl der Sekunden, die Windows mit dem
Herunterfahren warten soll. Wer wie im letzten Abschnitt erwähnt alle Programme
vor dem Herunterfahren ohne Rüchsicht auf Verluste abschießen möchte, kann
zusätzlich den Parameter "-f" anhängen. Weitere Parameter verrät wie gewohnt
shutdown /?
Wer stattdessen nur einzelne Prozesse beenden möchte, kann den Befehl
"Taskkill" nutzen, mehr dazu verrät "taskkill /?" auf der Kommandozeile.
*** Windows 2000 und NT ausschalten
Den XP-Vorgängern fehlen Bordmittel zum Herunterfahren. Wer zusätzlich über
XP verfügt, kann zwar dessen Shutdown.exe auch zum Herunterfahren von Windows
2000 nutzen, doch alle anderen gucken in die Röhre. Abhilfe schafft die Freeware
"Poweroff", die unter allen Windows-Versionen läuft. Zum Ausschalten
reicht das einfache Kommando
Poweroff shutdown
Der Parameter "-force" beendet brachial und ohne Rückfrage noch geöffnete
Anwendungen und lässt Anwendungen nicht gespeicherte Daten verwerfen.
Für NT steht eine weitere, mit der XP-Version nicht identische Shutdown.exe
in einem knapp 7 MByte goßen Resource Kit bei Microsoft zum Download bereit.
Vorrausetzung für das korrekte Funktionieren ist Service Pack 6, sonst schaltet
sich der PC nicht aus. Das Programm läuft auch unter Windows 2000. Der Aufruf
heißt hier
Shutdown /L /T:00
Der Parameter zum Herunterfahren ohne Rücksicht auf Verluste heißt hier "/C"
.
Wer nicht das ganze Resource Kit installieren will, kann die Shutdown.exe
auch einzeln herausoperieren. Zuerst legt man dafür einen temporären Ordner an,
der die Daten aufnehmen kann, etwa C:\Temp. Auf der Kommandozeile entpackt man
nun das Kommando
c:\downloads\sp4rk_i386 /t:c:\temp /c
den kompletten Inhalt der heruntergeladenen Datei in den neuen Ordner. Dort
öffnet man als Nächstes das Archiv "sp4rk86.cab" und extrahiert via Kontextmenü
daraus die Datei "NETMGMT_NETADMIN_shutdown.exe". Bei Windows 2000 geht das mit
Bordmitteln, NT-Nutzer brauchen einen Entpacker - wer keinen hat, kann auf der
Shareware-Seiten von www.heise.de unter mehreren wählen. Die extrahierte Datei
kann man anschließend noch in Shutdown.exe umbenennen.
Für Windows 2000 gibt es ebenfalls ein Resource Kit, welches die Shutdown.exe
enthält, jedoch ist das kostenpflichtig.
*** Windows schlafen legen (Standby-Modus aktivieren)
Wer seinen Rechner nicht vollkommen ausschalten, sondern nur in den Ruhestand
schicken möchte, sucht unter allen Windows-Versionen vergebens nach Bordmitteln
für die Kommandozeile. Stattdessen hilft wiederum die bereits erwähnte Freeware
"Poweroff" weiter. Das Kommando lautet dann
Poweroff hibernate
Alternativ versetzt der Parameter "standby" den PC eben in den Standby-Modus
- oder auch nicht. Was genau nach dem Aufruf einer der beiden Parameter
passiert, unterscheidet sich leider je nach Windows-Version und -Konfiguration
sowie je nach BIOS-Einstellungen. In der ACPI-Norm sind ja für die Stromsparmodi
vielfältige "Sleep States" definiert.
Antwort 2
~~~~~~~~~~~~~~~~~~~~~~~
[ von Herbert Hackelsberger ( www.hackelsberger.at ) , im QB-Forum,
31.1.2006 ]
.
Vor einiger Zeit schrieb ich ein Programm mit dem man das ATX-Netzteil
ausschalten kann. ACHTUNG!!! Direkt nachdem ausschalten gedrückt wird, schaltet
sich der PC aus, alle Dateien am PC die geöffnet sind gehen verloren oder können
beschädigt werden!!!
Am besten testet dies in einer MS DOS Umgebung auf einem PC mit ATX Netzteil.
Bei einem normalen AT Netzteil klappt dies nicht.
Geschrieben wurde es mit Quickbasic 4.5. Es ist kompatibel mit MS DOS 6.22
(wurde dafür entwickelt), Windows 95, 98, ME. Tests unter 2000, XP, NT, 2003
fehlen.
Voraussetzung: Der C muss das Ausschalten des Netzteiles unterstützen und das
Betriebssystem darf dies durch ein anders Programm nicht blockieren.
Ich kann auch nicht sagen, ob dieser Code nicht als Virus erkannt würde. Wie
gesagt am besten mal auf einem Test PC ausprobieren.
Das OUT &H64, &HFE funktioniert NUR unter DOS korrekt. Dafür gäbe es
auch eine Interrupt Funktion...
Und so sieht mein Programm aus:
' $INCLUDE: 'qb.bi'
' Power down
'
CLEAR
DIM dosintein AS RegType, dosintaus AS RegType
'
CLS
SCREEN 12
SLEEP 2
COLOR 9
PALETTE 0, 20
LOCATE 2, 14: PRINT "Herbert Hackelsberger, was willst du nun machen?"
LOCATE 4, 10: PRINT "Anmerkung: Durch Drcken der ESC-Taste zurck zum
Betriebssystem"
COLOR 15
LOCATE 12, 20: PRINT "Neustarten"
LOCATE 12, 40: PRINT "Auschalten"
COLOR 14: LOCATE 27, 44: PRINT "Version 1.0 (C) by Herbert Software"
dosintein.ax = &H0
CALL interrupt(&H33, dosintein, dosintaus)
dosintein.ax = &H1
CALL interrupt(&H33, dosintein, dosintaus)
dosintein.ax = &H3
CALL interrupt(&H33, dosintein, dosintaus)
dosintein.ax = &H7: dosintein.cx = 10: dosintein.dx = 630
CALL interrupt(&H33, dosintein, dosintaus)
dosintein.ax = &H8: dosintein.cx = 10: dosintein.dx = 460
CALL interrupt(&H33, dosintein, dosintaus)
dosintein.ax = &H4: dosintein.cx = 10: dosintein.dx = 10
CALL interrupt(&H33, dosintein, dosintaus)
'
dosintein.ax = &H3
'
DO
CALL interrupt(&H33, dosintein, dosintaus)
IF dosintaus.cx > 150 AND dosintaus.cx < 230 AND dosintaus.dx > 175
AND dosintaus.dx < 188 THEN
IF dosintaus.bx = 1 THEN OUT &H64, &HFE
END IF
IF dosintaus.cx > 310 AND dosintaus.cx < 390 AND dosintaus.dx > 175
AND dosintaus.dx < 188 THEN
IF dosintaus.bx = 1 THEN GOTO herunterfahren
END IF
taste$ = INKEY$
IF taste$ = CHR$(27) THEN SYSTEM
LOOP
'
herunterfahren:
dosintein.ax = &H5301
dosintein.bx = 0
CALL interrupt(&H15, dosintein, dosintaus)
dosintein.ax = &H530E
dosintein.bx = 0
dosintein.cx = &H102
CALL interrupt(&H15, dosintein, dosintaus)
dosintein.ax = &H5307
dosintein.bx = 1
dosintein.cx = 3
CALL interrupt(&H15, dosintein, dosintaus)
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]