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 ]