Ich verwende ein altes Windows 7-System über WLAN, auf das ich per Fernzugriff zugreife, um es zu überwachen.
Das Problem ist, dass das WLAN unvorhersehbar ist (aufgrund seltsamer Routerprobleme) und ich dieses System zu jeder Tageszeit online haben muss. Seltsamerweise wird die Verbindung bei einem WLAN-Ausfall nicht automatisch wiederhergestellt, obwohl es noch verfügbar ist und Windows so eingestellt ist, dass die Verbindung wiederhergestellt wird.
Ich habe hier eine ähnliche Frage mit Antwort gefunden, allerdings bezog sie sich auf ein kabelgebundenes Netzwerk, und leider funktioniert die Lösung für mein System nicht.
Es handelt sich um eine Batchdatei, wie unten beschrieben. Ich habe sie ausgeführt und den WLAN-Router ausgeschaltet, wodurch die Pings gestoppt wurden, aber die if-Anweisung zum Zurücksetzen der Schnittstelle wurde nicht abgeschlossen. Das Befehlsfenster zeigt lediglich an, dass der Ping abgelaufen ist, und wiederholt dies, bis die Verbindung wiederhergestellt ist. Die Protokolldatei protokolliert keinen Fehler, sodass sie nie zum Fehlerteil der if-Anweisung gelangt. Ich habe die ursprüngliche Variable „Schnittstelle“ von „LAN-Verbindung“ in „Drahtlose Netzwerkverbindung“ geändert.
Kann das jemand beheben oder eine alternative Möglichkeit vorschlagen, den Adapter automatisch zurückzusetzen, wenn das Netzwerk abbricht, da das das Problem anscheinend löst. Muss ich „Drahtlose Netzwerkverbindung (%SSID%)“ als Schnittstelle hinzufügen?
Danke!
Panterateama
@echo off
set INTERFACE="Local Area Connection"
set TIMEOUT=3600
set IP=8.8.8.8
set LOG="watchdog.log"
echo %DATE% %TIME%: Watchdog started >> %LOG%
:loop
rem First check the interface for an hour by pinging the Google DNS
rem and resetting the networking interface if it should fail.
ping -n %TIMEOUT% -w 1000 -l 0 %IP%
if %errorlevel% NEQ 1 goto :loop
echo %DATE% %TIME%: Connection failed. Restarting interface.. >> %LOG%
netsh interface set interface %INTERFACE% disable
netsh interface set interface %INTERFACE% enable
rem Give it another shot but restart the whole computer if it the
communication should still fail
ping -n %TIMEOUT% -w 1000 -l 0 %IP%
if %errorlevel% NEQ 1 goto :loop
echo %DATE% %TIME%: Still no connection. Restarting computer.. >> %LOG%
shutdown /r /c "Internet wathchdog"
echo %DATE% %TIME%: Waiting for system to shut down >> %LOG%
choice /T %TIMEOUT% /D Y /N > NUL
echo %DATE% %TIME%: Gave up on the shut down attempt. Trying again.. >>
%LOG%
goto :loop
Antwort1
Ändern Sie TIMEOUT auf 30. Dadurch wird der Reset ausgeführt, wenn die Verbindung 30 Sekunden lang unterbrochen war. Andernfalls muss sie 3600 Sekunden (1 Stunde) lang unterbrochen sein.
Außerdem sollten Sie für diesen Zweck nicht 8.8.8.8 verwenden. Stattdessen sollten Sie Ihre Gateway-IP-Adresse verwenden, die Sie unter gefunden haben ipconfig
. Wenn Sie eine externe IP wie 8.8.8.8 verwenden, setzt Ihr Computer Ihre Verbindung zurück und startet Ihren Computer sogar immer wieder neu, wenn beispielsweise Ihr Internet einfach ausfällt.
Durch die Verwendung einer internen IP wie Ihrer Gateway-Adresse wird ein Reset oder Neustart nur dann durchgeführt, wenn die WLAN-Verbindung tatsächlich unterbrochen ist.
Sie können dies auch als geplante Aufgabe ausführen, um es mit den höchsten Berechtigungen wie nt authority\system
beim Computerstart auszuführen. Ich würde das Timeout jedoch auf einen etwas längeren Wert ändern, beispielsweise 300 Sekunden, da das Skript möglicherweise ausgeführt wird, bevor Ihr Netzwerkstapel vollständig betriebsbereit ist.
BEARBEITEN: Wie in den Kommentaren angegeben, funktioniert das in der Frage gepostete Skript einfach nicht. Das Problem mit dem ursprünglichen Skript besteht darin, dass der Ping-Befehl möglicherweise eine „Antwort von xxx.xxx.xxx.xxx: Zielhost nicht erreichbar“ zurückgibt, was zu einer „erfolgreichen“ Fehlerstufe führt.
Unten finden Sie ein aktualisiertes Skript, das funktioniert und die Logik so ändert, dass es eine unterbrochene Verbindung effektiver erkennt. Ich habe auch den Teil entfernt, der den Computer neu starten würde – ich halte das für unnötig und möglicherweise problematisch. Beachten Sie, dass bei Ausführung dieses Befehls KEINE Ausgabe auf dem Bildschirm erfolgt. Stellen Sie sicher, dass der richtige Netzwerkschnittstellenname mithilfe des netsh interface show interface
Befehls abgerufen wurde.
@echo off
REM Modified by Appleoddity - 10/11/2017
REM Fixed ping status check; Removed shutdown/reboot ability; Improved logging
REM This script MUST RUN AS ADMIN
REM
REM Obtain network interface name with 'netsh interface show interface'
REM
REM Change the INTERFACE; THRESHOLD; IP; and LOG variables below.
REM Note: THRESHOLD is not necessarily the number of seconds before reset - but close
REM
setlocal EnableDelayedExpansion
set INTERFACE="Wi-Fi"
set THRESHOLD=30
set IP=10.1.10.1
set LOG="watchdog.log"
echo %DATE% %TIME%: Watchdog started >> %LOG%
SET /A COUNT=0
REM Loop until <THRESHOLD> failed, consecutive pings are counted
:LOOP
ping -n 1 -w 1000 -l 0 %IP% | find /i " bytes=" >NUL 2>&1
if errorlevel 1 (
set /A COUNT+=1
echo %DATE% %TIME%: Failed ping detected - Count = !COUNT!. >> %LOG%
) ELSE (
set /A COUNT=0
REM Pause
ping -n 2 -w 1000 -l 0 127.0.0.1 >NUL 2>&1
)
if %COUNT% GEQ %THRESHOLD% (
echo %DATE% %TIME%: %THRESHOLD% failed pings exceeded. >> %LOG%
GOTO RESET
)
GOTO LOOP
REM Reset the network interface
:RESET
echo %DATE% %TIME%: Restarting network interface - %INTERFACE% >> %LOG%
netsh interface set interface "%INTERFACE%" admin=DISABLED >NUL 2>&1
netsh interface set interface "%INTERFACE%" admin=ENABLED >NUL 2>&1
SET /A COUNT=0
GOTO LOOP
Antwort2
Wenn Sie„Eine Schnittstelle mit diesem Namen ist nicht beim Router registriert“Fehler, dann bedeutet dies, dass Sie in Ihrem Skript nicht den richtigen Netzwerkadapter auswählen.
Führen Sie den Batch/Befehl als Administrator aus?
Wenn Sie sicherstellen möchten, dass Sie über Administratorrechte verfügen, können Sie Folgendes ausführen:ncpa.cploder
netsh interface show interface
Dadurch erhalten Sie eine Liste mit Adaptern. Schreiben Sie dann basierend auf Ihren Adapternamen etwa Folgendes:
netsh interface set interface name="Local area connection" admin="disabled"
netsh interface set interface name="Wireless Network Connection" admin="disabled"
netsh interface set interface name="Local area connection" admin="enabled"
netsh interface set interface name="Wireless Network Connection" admin="enabled"
Dadurch wird der benötigte Adapter zurückgesetzt. Außerdem können Sie & verwenden, um sie alle aneinanderzureihen:
netsh interface set interface name="Local area connection" admin="disabled" & netsh interface set interface name="Local area connection" admin="enabled"