Batch überprüft ob PC im Netzwerk vorhanden, falls nicht Shutdown?

lifeguarder

Grünschnabel
Ich hab' hier eine kleine Batch Datei geschrieben :) :

@echo off
ping -n 1 -i 135 -w 130 192.168.000.001 (<- feste IP!)
if errorlevel 1 goto SHUTDOWN
goto RESET
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
:RESET
shutdown -a
goto ENDE
:ENDE

Soweit so gut, funktioniert auch, allerdings wenn die Meldung kommt, dass
der PC heruntergefahren wird sollen aktive Anwendungen minimiert werden!
Wie kann ich das machen?
 
Gar nicht schlecht Dein Batch.

Leider kann ich Dir nix zu Deiner Frage sagen, aber Dein Batch kann noch ne Zeile kürzer werden.

@echo off
ping -n 1 -i 135 -w 130 192.168.000.001 (<- feste IP!)
if errorlevel 1 goto SHUTDOWN
goto RESET

Diese Zeile braucht es nicht, weil mit goto RESET gehst Du nach unten, und mit goto SHUTDOWN auch,also wird diese Zeile gar nie aufgerufen. 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
:RESET
shutdown -a
goto ENDE
:ENDE
 
-

Um ein Programm zu minimieren, musst du per WinApi eine Nachricht an die betreffenden Fenster schicken. Sowas geht mit reinen Batchmitteln nicht.
 
Teoretisch geht das auch mit batchfiles, is aber extrem umständlich...

du musst mit rundll32 die WinAPI funktionen für das senden von WindowMessages benutzen..
(das is SendMessage()) und musst dann jedem fester ne minimieren nachricht senden...


In der praxis is es aber am einfachsten wenn du schreibst dazu n kleines C progy.
 
Hi,

hab zwar keine Lösung aber eine Idee.
Anstatt alle Fenster einzeln zu minimieren gibt es doch eine Funktion unter Window die alle Fenster aufeinmal minimiert. (WindowsTaste + M)
In irgendeiner DLL (user32.dll ? Hat zumindest mit Fenstern zu tun) ist diese Funktion enthalten die man dann per rundll32.exe aufrufen kann.

Bis dann

The Duke 404
 
Zuletzt bearbeitet:
Hallo lifeguarder,

ich hätte mal eine kleine Frage (vielleicht etwas OT, aber nich ganz am Thema vorbei ;) ), du verwendest in deinem Batch ja den Befehl Ping sowie errorlevel, nun gibt Ping jedoch kein errorlevel zurück, mich würde dann Interessieren, wie dein Batch fehlerfrei funktionieren kann?

Grüßlie vom
Harlequin
 
Moin Harlequin,
jedes Programm setzt die Umgebungsvariable ERRORLEVEL. Zumindest wird diese bei jedem Programmstart auf 0 zurückgesetzt. Ob nun irgendein Programm von Firma XYZ korrekterweise einen Fehlercode setzt beim fehlerhaften Beenden, ist natürlich nicht gesichert, aber gerade systemeigene Kommandozeilen-Tools machen dies natürlich. Du kannst ganz einfach mal einen ping auf den Host "gibtsnicht" ausführen und danach mal ein "echo %errorlevel%" eingeben. Da wird dann eine 1 erscheinen. Bei einem gültigen Ping wird dort eine 0 stehen, bei einem Abbruch durch Strg+C wieder was anderes.

Peter
 
Original geschrieben von Fluke
Moin Harlequin,
jedes Programm setzt die Umgebungsvariable ERRORLEVEL. Zumindest wird diese bei jedem Programmstart auf 0 zurückgesetzt. Ob nun irgendein Programm von Firma XYZ korrekterweise einen Fehlercode setzt beim fehlerhaften Beenden, ist natürlich nicht gesichert, aber gerade systemeigene Kommandozeilen-Tools machen dies natürlich. Du kannst ganz einfach mal einen ping auf den Host "gibtsnicht" ausführen und danach mal ein "echo %errorlevel%" eingeben. Da wird dann eine 1 erscheinen. Bei einem gültigen Ping wird dort eine 0 stehen, bei einem Abbruch durch Strg+C wieder was anderes.

Peter
Code:
>ping proxy
Ping proxy.************ [134.***.***.***] mit 32 Bytes Daten:

Antwort von 134.***.***.***: Bytes=32 Zeit<10ms TTL=63
Antwort von 134.***.***.***: Bytes=32 Zeit<10ms TTL=63
Antwort von 134.***.***.***: Bytes=32 Zeit<10ms TTL=63
Antwort von 134.***.***.***: Bytes=32 Zeit<10ms TTL=63

>echo %errorlevel%
0
Erfolgreicher Ping -> errorlevel: 0

Code:
>ping blablub
Unbekannter Host blablub.

>echo %errorlevel%
1
Ping auf Host, der nicht resolved werden kann -> errorlevel: 1

Code:
>ping google.de

Ping google.de [216.239.59.104] mit 32 Bytes Daten:

Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

>echo %errorlevel%
0
Ping auf Host, der resolved werden kann, aber der Ping schlägt fehlt (in dem Falle, weil ich aus dem LAN keine Internetdomains pingen darf/kann) wird allerdings auch zu errorlevel 0.
Und hier liegt denke ich das Problem. Dadurch, dass er eine explizite IP pingt, wird er nie Probleme bekommen beim resolven des Hostnames sondern nur eine Zeitüberschreitung der Anwendung, die zum gleichen errorlevel führt wie ein erfolgreicher Ping.

Was ich damit sagen will: Ich habe zwar absolut null Ahnung von Batch-Programmierung, aber anhand des Errorlevels eines ping Kommandos die Erreichbarkeit eines Rechners zu definieren sollte somit nicht möglich sein ;)

Code:
>ping google.de

Ping google.de [216.239.59.104] mit 32 Bytes Daten:

Zeitüberschreitung der Anforderung.
STRG-C

>echo %errorlevel%
-1073741510
Just for the fun of it :p
 
Original geschrieben von Tim Comanns
Ping auf Host, der resolved werden kann, aber der Ping schlägt fehlt (in dem Falle, weil ich aus dem LAN keine Internetdomains pingen darf/kann) wird allerdings auch zu errorlevel 0.
Und hier liegt denke ich das Problem. Dadurch, dass er eine explizite IP pingt, wird er nie Probleme bekommen beim resolven des Hostnames sondern nur eine Zeitüberschreitung der Anwendung, die zum gleichen errorlevel führt wie ein erfolgreicher Ping.
DAS hab ich natürlich vergessen, zu überprüfen :-(.

Aber hier auch schon eine Lösung der Problematik:
Code:
>ping localhost | find "TTL="
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

>echo %errorlevel%
0

>ping www.google.de | find "TTL="

>echo %errorlevel%
1
Ich kann hier auch nicht ins Internet pingen.

Peter :)
 
ping http://www.google.de | find "TTL="
Antwort von 66.102.9.99: Bytes=32 Zeit=47ms TTL=63
Antwort von 66.102.9.99: Bytes=32 Zeit=31ms TTL=63
Antwort von 66.102.9.99: Bytes=32 Zeit=32ms TTL=63
Antwort von 66.102.9.99: Bytes=32 Zeit=32ms TTL=63

echo %errorlevel%
0

ähm also bei mir pingt er auch ins internet ;)

und Zeitüberschreitungen müssen nicht am DNS liegen, wenn das Netzwerk spinnt, nen Router abgestürzt ist oder sonst was, rechner halb aufgehängt kann sowas auch kommen :>
 

Neue Beiträge

Zurück