Ich hab mir ein kleines Skript geschrieben, mit dem ich meinen WHS (Windows Home Server) in den Ruhezustand versetzten kann, wenn alle Netzwerkgeräte ausgeschaltet sind!
Funktion:
- WHS fährt jede Früh automatisch aus dem Ruhezustand hoch
- mein Programm läuft im Hintergrund
- wenn eine Gewisse Zeit überschritten wird (22Uhr), vor der es gar nichts macht
- es testet ob schon ein Netzwerkgerät erreichbar ist (mittels Ping()), damit es nicht herunterfahrt, weil es meint, dass alle Geräte schon aus sind (obwohl noch keine gestartet sind)
- wenn min. ein Gerät anpingbar ist, pingt es weiter und testet so lange bis keine Geräte mehr erreichbar sind
- falls das der Fall ist, gibt es eine MsgBox aus in der man noch 30s verhindern kann, dass der WHS in den Ruhezustand fährt
- dann wieder holt sich alles von Vorne
Programmablaufplan
[Blockierte Grafik: http://saved.im/mtg3mdc5cwpq/cping.png]
Quellcode
; Include Dateien
#include-once
#include <Array.au3>
; TrayIcon
;#NoTrayIcon ; TryIcon ausblenden
Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
Opt("TrayIconDebug", 1) ; zeige Debug
; Variablen
$zeit_ping = 60 * 1000 ; Abstände der Pings | in ms
$zeit_aus = 30 ; Wann der WHS dann herunterfährt, nach dem letzten Ping | in s
$zeit_start = 5 * 60* 1000 ; Wie lange das Programm, nach dem herunterfahren wartet, bis es das erste mal pingt | in ms
$zeit_uhrzeit = 22 ; Früheste Zeit zum herunterfahren | in h
dim $ping[2]
dim $host[UBound($ping)]
$host[0] = "client1"
$host[1] = "192.168.1.123"
While 1
; Warten bis Uhrzeit erreicht ist
While 1
if @HOUR >= $zeit_uhrzeit then exitloop
sleep($zeit_ping)
Wend
;MsgBox(0, "", "Min. ein Gerät ist an!", 3)
; Warten bis min. ein Gerät gestartet ist
While 1
for $n=0 to UBound($host)-1
$ping[$n] = Ping($host[$n], 4000)
;$error = @error
;MsgBox(0, "Test:", $host[$n])
next
if _ArrayToString($ping, '') <> 0 then exitloop
sleep($zeit_ping)
Wend
;MsgBox(0, "", "Min. ein Gerät ist an!", 3)
; Warten, bis alle Geräte ausgeschalten sind
While 1
for $n=0 to UBound($host)-1
$ping[$n] = Ping($host[$n], 4000)
;$error = @error
;MsgBox(0, "Test:", $host[$n])
next
if _ArrayToString($ping, '') = 0 then exitloop
sleep($zeit_ping)
Wend
;MsgBox(0, "", "Alle Geräte sind aus!", 3)
; WHS wird in den Ruhezustand versetzt
$msg = MsgBox(4, "", "Alle Geräte sind aus, der WHS wird in den Ruhezustand versetzt!", $zeit_aus)
if $msg <> 7 then
Shutdown(64, "Durch cPing!") ; Ruhezustand
;MsgBox(0, "", "WHS ist jetzt aus!", 10)
endif
sleep($zeit_start)
Wend
Das mit der ini-Abfrage und die Start-GUI sind noch nicht fertig, der Rest funktioniert mit den festen Werten!
Das mit den vielen sleeps gefällt mir nicht so ganz, dass kann man doch sicher besser machen?
Das der zumindest bei der Uhrzeit-Abfrage so lange wartet, bis die Zeit erreicht ist ... ohne sleep und while-Schlife!?
Aber die System-Auslastung ist eh bisher minimal ...
Ich würde auch gerne noch einbauen, dass man damit die Uhrzeit einstellen kann, wann der WHS wieder hochfährt.
Bisher mache ich das über ein extra Programm ...
Was kann ich noch verbessern?