PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Windows Batch-Skript mit "if" - Hilfe benötigt


mAxmUrdErEr
2013-04-26, 12:28:22
Ich habe ein Batch-Skript, um automatisch zum WLAN zu reconnecten, weil das Windows 8 nicht mehr macht, wenn ein Ethernetkabel angeschlossen ist. So siehts aus:

:RECONNECT
netsh wlan connect name=MEINWLAN
sleep 1800
goto RECONNECT

Das funktioniert, jedoch ist es recht brutal: Alle 30min wird automatisch die WLAN-Verbindung neu hergestellt, was auch bedeutet, dass alle 30min kurz die WLAN-Verbindung ausfällt. Ein bessere Lösung würde so aussehen:

1. Den Router pingen alle 30min (192.168.2.1). Dieser Router ist nur über WLAN erreichbar, nicht übers Kabel.
2. Wenn Paket zurückkomt, nix tun.
3. Wenn kein Paket zurückkomt, dann "netsh wlan connect name=MEINWLAN".


Es stellt sich jedoch raus, dass meine Batch-Skills massiv mangelhaft sind und eine einfache Lösung nicht in Sicht ist.

Ist das, was ich will, überhaupt machbar?
Hat irgendjemand hier eine Idee, wie ein passendes Skript für sowas aussehen könnte?

Birdman
2013-04-26, 13:38:07
Das müsste gehen:


:PINGCHECK
ping -n 1 192.168.2.1 | find "Verloren = 1" >nul 2>&1 && goto RECONNECT
sleep 1800
goto PINGCHECK

:RECONNECT
netsh wlan connect name=MEINWLAN
sleep 1800
goto PINGCHECK



edited weil brainerror beim ersten versuch

das "sleep" nach dem Reconnect ist evtl. nicht nötig, bzw. kein so langes.
Dunno wie lange es nach reconnect command geht, bis ein Ping wieder möglich ist.

sei laut
2013-04-26, 13:56:17
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=539851

Das von tsag kannst du auch einfach für deine Zwecke umbauen. Dachte erst, ist der gleiche Fall. :freak:
Ödit: Ok, nach Umbau erhälst du quasi das von Birdman.

Lokadamus
2013-04-26, 20:07:48
Ich geh davon aus, dass du das Skript alle 30Minuten über den Taskplaner ausführen lässt.

So was könnte gehen (nicht getestet):

ping 192.168.2.1
IF ERRORLEVEL 0 goto EXIT
netsh wlan connect name=MEINWLAN

:EXIT

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/if.mspx

littlejam
2013-04-26, 21:54:23
Ein popeliger Einzeiler über den Taskplaner...
ping -n 1 192.168.2.1 || netsh wlan connect name=MEINWLAN

Oder halt wie die Vorposter sleeps drumbasteln, dann ist aber immer 'ne Shell offen.

Gruß

Lokadamus
2013-04-26, 22:32:10
littlejam, nette Idee. Hab mich nie mit den Oder- Verknüpfungen unter DOS/ Windows beschäftigt.

Was mir gerade einfällt, wie sieht die Routingtabelle eigentlich aus?
Ein netstat -nr oder ein einfaches netstat könnte zusammen mit find das Problem auch ohne Ping lösen.

mAxmUrdErEr
2013-04-26, 22:52:59
Danke für die vielen Vorschläge!

Es ist jetzt die Version von Birdman geworden, die offene Shell auf dem PC ist egal.

Vielleicht werde ich eines Tages upgraden auf die Version von Littlejam und den Taskplaner benutzen - auch wenn mir unklar ist, wie diese funktioniert bzw. den Befehl nicht verstehe.

Ein popeliger Einzeiler über den Taskplaner...
ping -n 1 192.168.2.1 || netsh wlan connect name=MEINWLAN

Oder halt wie die Vorposter sleeps drumbasteln, dann ist aber immer 'ne Shell offen.

Gruß
Wo genau wird hier geprüft, ob die Verbindung bereits besteht?

Lokadamus
2013-04-26, 23:04:32
Das, was littlejam gemacht hat, ist eine Oder- Verknüpfung. Das bedeutet, dass der vordere Teil vor dem Order ( = || ) fehlerfrei ausgeführt wurde, nichts weiter passiert. Wenn aber das Paket von dem Ping verloren geht, der hintere Teil ausgeführt werden soll. Es ist im Prinzip eine Kurzfassung von meinem Errorlevel. Errorlevel = 0 bedeutet, dass der Befehl erfolgreich ausgeführt wurde.

Wenn 1800 Sekunden = 30 Minuten sind (nach ein paar Glas hat man keine Lust mehr zu Rechnen ;)), währe der Taskplaner sinnvoller. Warum soll ein Prozess im Hintergrund schlafen, wenn er auch nur alle 30 Minuten gestartet werden kann?

mAxmUrdErEr
2013-04-26, 23:11:04
Das, was littlejam gemacht hat, ist eine Oder- Verknüpfung. Das bedeutet, dass der vordere Teil vor dem Order ( = || ) fehlerfrei ausgeführt wurde, nichts weiter passiert. Wenn aber das Paket von dem Ping verloren geht, der hintere Teil ausgeführt werden soll. Es ist im Prinzip eine Kurzfassung von meinem Errorlevel. Errorlevel = 0 bedeutet, dass der Befehl erfolgreich ausgeführt wurde.

Wenn 1800 Sekunden = 30 Minuten sind (nach ein paar Glas hat man keine Lust mehr zu Rechnen ;)), währe der Taskplaner sinnvoller. Warum soll ein Prozess im Hintergrund schlafen, wenn er auch nur alle 30 Minuten gestartet werden kann?
Sehr spannend, danke für die Erklärung. Und Windows deklariert ein verlorenes Paket als Fehlschlag? Oder müssen dafür erst alle 4 Pakete verloren gehen?

Das werde ich wohl ausprobieren müssen.

littlejam
2013-04-26, 23:19:17
littlejam, nette Idee. Hab mich nie mit den Oder- Verknüpfungen unter DOS/ Windows beschäftigt.

Was mir gerade einfällt, wie sieht die Routingtabelle eigentlich aus?
Ein netstat -nr oder ein einfaches netstat könnte zusammen mit find das Problem auch ohne Ping lösen.

Auch ein guter Plan und warscheinlich stabiler als ein Ping, das wäre dann sowas...
route print|find "192.168.2.0" || netsh wlan connect name=MEINWLAN

Danke für die vielen Vorschläge!

Es ist jetzt die Version von Birdman geworden, die offene Shell auf dem PC ist egal.

Vielleicht werde ich eines Tages upgraden auf die Version von Littlejam und den Taskplaner benutzen - auch wenn mir unklar ist, wie diese funktioniert bzw. den Befehl nicht verstehe.
Das sind 2 Befehle per ODER (||) verknüpft.
Das heißt, wenn der 1. Befehl fehlschlägt, wird der 2. ausgeführt.
Wenn der 1. Befehl erfolgreich ist, wird der 2. nicht ausgeführt.
ping -n 1 192.168.2.1 || netsh wlan connect name=MEINWLAN
Heißt also, dass wenn 192.168.2.1 erreichbar ist, ist alles ok, wenn nicht dann macht der den reconnect.
"-n 1" bedeutet, dass nur ein Paket geschickt wird.

Taskplaner hat den Vorteil, dass keine Shell offen ist und den Nachteil, dass das quasi immer läuft/nicht steuerbar ist.

Sleep würd ich allerdings auch nicht nehmen, bei mir ists bspw. nicht drauf (Win8). Das kann man auch per ping machen...

ping -n 2 localhost > nul
ping -n 601 localhost > nul
Ersteres wartet eine Sekunde, Zweiteres 5 Min.

Gruß
*Edit: Hoppala hat ein bisschen länger gedauert, Lokadamus war schneller :D

Lokadamus
2013-04-26, 23:46:27
Auch ein guter Plan und warscheinlich stabiler als ein Ping, das wäre dann sowas...
route print|find "192.168.2.0" || netsh wlan connect name=MEINWLANnetstat ist besser, weil funktioniert überall (Windows, Linux, *BSD, Mac OS X, wahrscheinlich auch Solaris).Sehr spannend, danke für die Erklärung. Und Windows deklariert ein verlorenes Paket als Fehlschlag? Oder müssen dafür erst alle 4 Pakete verloren gehen?

Das werde ich wohl ausprobieren müssen.um die Frag kurz zu beantworten, es reicht "leider", das ein von den 4 Paketen verloren geht, um es als Fehlschlag anzusehen.