Batch Computer herunterfahren wenn IP XY nicht erreichbar

Hc-Yami

Admiral
Registriert
Juni 2010
Beiträge
7.286
Guten Tag,
ich habe mithilfe des Internet das hier zusammen gebastelt:

Code:
@echo off
ping -n 1 -i 135 -w 130 10.0.0.XY
if errorlevel 1 goto SHUTDOWN
:SHUTDOWN
shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
goto ENDE
:ENDE

Hintergrund ist, dass ich einen Computer habe, der unsere BlueRays bereitstellt. Wenn ich fertig mit dem Film bin, schalte ich das Gerät brav mit meinem Mobiltelefon über RDP aus. Mein Vater schaut jedoch genau so über den Computer, er fährt das Gerät nicht herunter, da ich ja bspw. noch schauen könnte. Ziel der .batch Datei ist es nun die beiden Fernseher abzufragen, wenn sie an sind, soll nichts passieren, sind sie aus, soll das Gerät sich herunterfahren.

Demnach verbleiben mir zwei Fragen:
1. Wie baue ich eine UND Abfrage in die .batch oben? Es soll abegfragt werden ob 10.0.0.10 UND 10.0.0.20 abgeschaltet sind und dann den Computer herunterfahren.
2. Kann ich einfach einem Task sagen, er soll die .batch alle zehn Minuten aufrufen?

Grüße
 
Bin jetzt kein Batch "Experte", ich kann dir also nicht sagen ob es einen & Operator gibt und ob meine Lösung dem Stylecode entspricht, aber ich wäre so vorgegangen:

Code:
@echo off

:START
ping -n 1 -i 135 -w 130 10.0.0.XY  ::Frage ob Fernseher 1 aus ist
if errorlevel 1 goto UNDFRAGE1     ::Fernseher 1 aus, Frage ob auch Fernseher 2 aus ist
goto ENDE

:SHUTDOWN
shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
goto ENDE

:UNDFRAGE1               ::Fernseher 1 aus, frage nach ob Fernseher 2 auch aus ist
ping -n 1 -i 135 -w 130 10.0.0.XY
if errorlevel 1 goto SHUTDOWN :: Fernseher 2 ist auch aus, springe zu SHUTDOWN
goto ENDE
:ENDE

In Batch wird wenn eine if-Abfrage false ergibt direkt dahinter weitergemacht, somit wird mit deinem Original, egal ob du true oder false hast der PC immer heruntergefahren, das kannst du verhindern indem du danach einfach wieder zum Start(wenn wiederholt abgefragt werden soll) oder zum Ende(wenn du so wie du nur einmal fragen möchtest und dann in 10 Minuten wieder). Eigentlich musst du auch nur abfragen ob Fernseher 1 aus ist, ist er das nicht ist es vollkommen egal was Fernseher 2 macht, der PC bleibt an

Es könnten evtl noch Fehler im Skript sein, würde es also vorher testen, weil ich wie gesagt nicht soviel Ahnung von hab^^

Edit: Samurais Lösung ist natürlich die schönere :)
 
Zuletzt bearbeitet:
Lösung von Jesertfox einbauen, aber Zeile 6 gehört derzeit nach Zeile 4, 4 und 5 dementsprechend 5 und 6. Sonst ist deine Errorlevel abfrage Sinnlos, da er so oder so den Shutdown als nächstes ausführt.
Code:
    @echo off
    ping -n 1 -i 135 -w 130 10.0.0.XY
    if errorlevel 0 goto ENDE
    ping -n 1 -i 135 -w 130 10.0.0.YZ
    if errorlevel 1 goto SHUTDOWN
    
    :ENDE
    exit    
    
    :SHUTDOWN
    shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
 
Zuletzt bearbeitet:
Ich hätte es gar nicht selber machen sollen. :D
Rein aus meinem Interesse (kann kein .batch, hab jetzt alles versucht halbwegs logisch zu machen).
Wäre das auch so richtig gewesen?

Code:
@echo off
ping -n 1 -i 135 -w 130 10.0.0.22
if errorlevel 1 goto SHUTDOWN
if errorlevel 0 goto ZWEITERPC

:ZWEITERPC
ping -n 1 -i 135 -w 130 10.0.0.27
if errorlevel 1 goto SHUTDOWN
if errorlevel 0 goto ENDE

:SHUTDOWN
shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
:ENDE
exit
 
Ich bin mir jetzt nicht ganz sicher, aber in deinem zu letzt gepostetem Lösungsansatz fährt der PC auch herunter wenn nur einer der TVs aus ist, wenn du die Sprungmarken in deinen Abfragen vertauscht sollte es aber richtig sein, da wenn einer der Fernseher ein ist, es ja egal ist ob der andere auch ein ist oder ausgeschaltet, andersherum ist es ja aber so das wenn TV1 aus ist du checken musst ob TV2 auch aus ist :)
 
Ja, kurz überflogen, deine Batch müsste funkionieren, bietet aber noch Optimierungspotenzial.

Stimmt, deine Batch fährt runter, wenn die erste Prüfung fehlschlägt, ohne zu Wissen, was mit der zweiten Prüfung ist.
 
Stimmt das macht Sinn.

Vielen Dank für eure freundliche Hilfe, ich werde dann mal testen. :)
 
lasst mal den gotoschrott weg. gar nicht erst angewöhnen.

Code:
@echo off

ping -n 1 -l 128 -w 2000 10.0.0.1
if errorlevel 1 (
    ping -n 1 -l 128 -w 2000 10.0.0.2
    if errorlevel 1 (
        shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
    )
)

sobald kein ping zu beiden ports möglich ist, fährt der rechner runter.
gruß
Ergänzung ()

PS: Besser wäre es eigentlich zu schreiben "if NOT errorlevel 0", da man so auch alle anderen fehler mit einbezieht. wobei ich gar nicht genau weiß ob es anderes außer 0 und 1 gibt.
 
Zuletzt bearbeitet:
ekin06 schrieb:
lasst mal den gotoschrott weg. gar nicht erst angewöhnen.

Code:
@echo off

ping -n 1 -i 135 -w 130 10.0.0.1
if errorlevel 1 (
    ping -n 1 -i 135 -w 130 10.0.0.2
    if errorlevel 1 (
        shutdown -s -t 1800 -c "Der Computer wird in 30 Minuten heruntergefahren, da keine Verbindung zum Netzwerk besteht!" -d u:11:11
    )
)

sobald kein ping zu beiden ports möglich ist, fährt der rechner runter.
gruß


Gefällt mir, und für den perfekten Code würde ich noch nach dem zweiten if eine Abfrage mit Ping zum ersten PC machen, denn wenn der erste PC mal neustartet und kurzzeitig nicht reagiert würde bei dem aktuellen Code nach Abschaltung des zweiten PCs der Server herunterfahren (nach 30 Minuten).
 
Sind ja beides Fernseher :). Ich muss dir aber zustimmen. Als ich den Code getestet habe, ist 1 - 2 mal der Ping nicht angekommen (ich habs an zwei Servern im Netzwerk getestet) obwohl der Server definitiv ansprechbar war. Ich würde dem TE also empfehlen das Zeitfenster, in welches der Fernseher antworten kann, um einiges höher zu setzen. Gib dem Fernseher 5-10 Sekunden Zeit zu antworten (z.B. -w 5000), dann kann du auch sicher sein, dass er Offline ist (wenn er nicht antwortet) und brauchst dann auch keine anderen Abfragen mehr).
Ergänzung ()

lol, voll komisch. hab grad einen ping mit -w 5000 probiert und er zeigt jedesmal an empfangen obwohl es den server gar nicht gibt. hat -w einen grenzwert? also bis -w 2500 scheint es zu funktionieren. Ach ja, nochwas an den TE. Den Schalter -i gibt es nicht! Um die Paketgröße zu ändert musst du ein kleine L ("EL") benutzen. Ich ändere das gleich mal im Skript.
 
Zuletzt bearbeitet:
Lasst mich raten, unter der windows-shell gehen sowohl "while" noch "until"-Schleifen nicht? Das wäre die elegantere Lösung für einen Hintergrund-job...
 
Die CMD kann das nicht, aber mit der Powershell müsste das gehen. Hab die aber selber noch nie benutzt.

Aber für Hintergrundjobs gibts ja den Taskplaner. Unter Unix benutzt man dafür ja üblicherweise auch cron-jobs.
 
Na, ich würd's in die rc.local packen. Es kann ja sehr schön im Hintergrund die Schleife in bestimmten Zeitabschnitten durchlaufen, sprich also immer mal wieder schlafen gelegt werden, solange noch ein Rechner pingbar ist, und erst dann aktiv werden, wenn alle Rechner für länger als x sekunden eben nicht pingbar sind, den server herunterfahren.
Es stets alle x sekunden neu aufzurufen empfände ich als zu umständlich.

Unter Windows wäre das dann eben ein startup-script.
 
Zurück
Oben