Я использую старую систему Windows 7 по Wi-Fi, к которой у меня удаленный доступ к монитору.

Проблема в том, что WiFi непредсказуем (из-за странных проблем с роутером), и мне нужно, чтобы эта система была подключена к сети в любое время суток. Как ни странно, когда Wi-Fi падает, он не имеет тенденцию автоматически переподключаться, даже если он все еще доступен, и Windows настроен на переподключение к нему.

Я нашел похожий вопрос с ответом здесь, но это было для проводной сети, и, к сожалению, решение не работает для моей системы.

Это командный файл, созданный ниже. Я запустил его, убил маршрутизатор Wi-Fi, который остановил эхо-запросы, но он не завершил оператор if для сброса интерфейса. В командном окне просто отображается время ожидания проверки связи и повторяется до тех пор, пока соединение не будет восстановлено. Файл журнала не регистрирует ошибку, поэтому он никогда не попадает в часть ошибки оператора if. Я изменил первоначальный вариант "Интерфейс" с "Подключение по локальной сети" на "Подключение к беспроводной сети"

Может кто-нибудь устранить эту проблему или предложить альтернативный вариант для автоматического сброса адаптера, когда сеть падает, как кажется, это исправить. Нужно ли добавить «Беспроводное сетевое соединение (% SSID%)» в качестве интерфейса?

Спасибо!

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

2 ответа2

1

Измените время до 30. Это скажет ему выполнить сброс, если соединение было разорвано в течение 30 секунд. В противном случае он должен быть выключен на 3600 секунд (1 час).

Кроме того, вы не должны использовать 8.8.8.8 для этой цели. Вместо этого вы должны использовать IP-адрес вашего шлюза, найденный с помощью ipconfig . Если вы используете внешний IP-адрес, такой как 8.8.8.8, ваш компьютер перезагрузит ваше соединение и даже продолжит перезагружать компьютер, если что-то вроде вашего интернета просто выйдет из строя.

Используя внутренний IP-адрес, такой как адрес вашего шлюза, он будет сбрасываться или перезагружаться только тогда, когда соединение Wi-Fi фактически отключено.

Кроме того, вы можете запустить это как запланированное задание для запуска с наивысшими привилегиями как nt authority\system при запуске компьютера. Но я бы изменил время ожидания на что-то более длинное, например, на 300 секунд, потому что сценарий может запуститься до того, как ваш сетевой стек полностью заработает.

РЕДАКТИРОВАТЬ: Как указано в комментариях, сценарий, размещенный в вопросе, просто не работает. Проблема с оригинальным сценарием заключается в том, что команда ping может возвращать «Ответить от xxx.xxx.xxx.xxx: узел назначения недоступен», что приводит к "успешному" уровню ошибки.

Ниже приведен обновленный скрипт, который работает и меняет логику, чтобы более эффективно обнаруживать сбитое соединение. Я также удалил часть, которая перезагрузит компьютер - я чувствую, что это ненужно и потенциально проблематично. Обратите внимание, что при выполнении этой команды на экране НЕТ вывода. Убедитесь, что правильное имя сетевого интерфейса получено с помощью команды netsh interface show interface .

@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
0

Если вы получаете сообщение об ошибке "Интерфейс с таким именем не зарегистрирован на маршрутизаторе" , это означает, что вы не выбрали правильный сетевой адаптер в своем скрипте.

Вы запускаете пакет / команду от имени администратора?

Если вы хотите убедиться, что у вас есть права администратора, вы можете запустить ncpa.cpl или

netsh interface show interface

который дает вам список адаптеров, а затем пишет что-то вроде этого, основываясь на именах ваших адаптеров:

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"

Это сбросит требуемый адаптер, плюс вы можете использовать &, чтобы связать их все вместе:

netsh interface set interface name="Local area connection" admin="disabled" & netsh interface set interface name="Local area connection" admin="enabled"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .