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



## lifeguarder (22. Dezember 2003)

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?


----------



## tuxracer (23. Dezember 2003)

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


----------



## Patrick Kamin (23. Dezember 2003)

*-*

Um ein Programm zu minimieren, musst du per WinApi eine Nachricht an die betreffenden Fenster schicken. Sowas geht mit reinen Batchmitteln nicht.


----------



## chibisuke (24. Dezember 2003)

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.


----------



## TheDuke (8. Februar 2004)

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


----------



## Harlequin (19. Februar 2004)

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


----------



## Peter Bönnen (19. Februar 2004)

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


----------



## Tim C. (19. Februar 2004)

> _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 *




```
>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


```
>ping blablub
Unbekannter Host blablub.

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


```
>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 


```
>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


----------



## Peter Bönnen (19. Februar 2004)

> _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:
	
	
	



```
>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


----------



## EngelchenB (19. Februar 2004)

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 :>


----------



## Peter Bönnen (19. Februar 2004)

Damit wird jeder Ping timeout und auch andere Fehler abgefangen, da ping nur die TTL ausspuckt, wenn der ping erfolgreich ist. Mit DNS hat das Beispiel nichts mehr zu tun (die IP von http://www.google.de wird aufgelöst, aber ich komm halt nicht raus) .

Ich kann hier wie Tim halt nicht direkt übers LAN ins Internet pingen und hab das lediglich als Beispiel gewählt, um das gleiche Beispiel wieder aufzugreifen. Der Zweck lag halt darin, einen Timeout zu simulieren. Dass ein Timeout viele Ursachen haben kann ist logisch, allerdings soll die Batch Datei ja "reagieren", wenn es Netzwerkprobleme welcher Art auch immer gibt.

Aber das ganze ist mittlerweile ziemlich Offtopic zur eigentlichen Fragestellung des Threadstarters.

Ich wollte ja eigentlich nur die Umgebungsvariable ERRORLEVEL erläutern... 

Peter


----------

