Задача
Дома и в командировках меня раздражали внезапные «тихие» обрывы Wi‑Fi. Хотелось, чтобы система сама возвращала подключение, но не спорила со мной, если я сознательно нажал «Отключить Wi‑Fi». И чтобы всё было прозрачно: логи, автозапуск, минимум магии.
Ограничения
Windows 10/11 и PowerShell 5.1+ — без сторонних демонов.
Никаких паролей в логах и странных автологинов.
Автоматика не должна мешать: ручное отключение — табу.
Архитектура
WifiMonitor.ps1 — наблюдение за стабильностью (ping, события), диагностика, логи.
WiFiAutoReconnect.ps1 — восстановление через netsh к доверенным сетям, игнор ручных отключений.
Планировщик задач — два фоновых задания с автозапуском и повышенными правами.
Логи и конфигурация — C:\ProgramData\WiFiDiag.
Реализация
Фильтр «ручного отключения»
Проверяю событие WLAN‑AutoConfig ID 8002 и статус адаптера (Disabled). Если это «воля пользователя», переподключение не стартует.
Критерий «реального обрыва»
Серия неудачных ping до надёжной цели (у меня 1.1.1.1); после порога срабатывает восстановление. Это лучше, чем одиночные «шумы».
Восстановление
Скрипт сканирует доступные сети и:
в приоритете пытается вернуться к последней успешной;
иначе — к первой из списка доверенных, профили которых уже есть в Windows.
Пароли не пишутся и не читаются в явном виде — работает механизм профилей Windows.
Логирование
Каждое действие записывается в C:\ProgramData\WiFiDiag\wifi-reconnect.log с таймстемпами: от «ping упал (2/3)» до «подключено к SSID».
Автозапуск и эксплуатация
Задача
Дома и в командировках меня раздражали внезапные «тихие» обрывы Wi‑Fi. Хотелось, чтобы система сама возвращала подключение, но не спорила со мной, если я сознательно нажал «Отключить Wi‑Fi». И чтобы всё было прозрачно: логи, автозапуск, минимум магии.
Ограничения
Windows 10/11 и PowerShell 5.1+ — без сторонних демонов.
Никаких паролей в логах и странных автологинов.
Автоматика не должна мешать: ручное отключение — табу.
Архитектура
WifiMonitor.ps1 — наблюдение за стабильностью (ping, события), диагностика, логи.
WiFiAutoReconnect.ps1 — восстановление через netsh к доверенным сетям, игнор ручных отключений.
Планировщик задач — два фоновых задания с автозапуском и повышенными правами.
Логи и конфигурация — C:\ProgramData\WiFiDiag.
Реализация
Фильтр «ручного отключения»
Проверяю событие WLAN‑AutoConfig ID 8002 и статус адаптера (Disabled). Если это «воля пользователя», переподключение не стартует.
Критерий «реального обрыва»
Серия неудачных ping до надёжной цели (у меня 1.1.1.1); после порога срабатывает восстановление. Это лучше, чем одиночные «шумы».
Восстановление
Скрипт сканирует доступные сети и:
в приоритете пытается вернуться к последней успешной;
иначе — к первой из списка доверенных, профили которых уже есть в Windows.
Пароли не пишутся и не читаются в явном виде — работает механизм профилей Windows.
Логирование
Каждое действие записывается в C:\ProgramData\WiFiDiag\wifi-reconnect.log с таймстемпами: от «ping упал (2/3)» до «подключено к SSID».
Автозапуск и эксплуатация
Завёл две задачи планировщика. Да, на первом заходе поймал 0x800700b7: «уже существует». Решение — удалять/пересоздавать атомарно:
powershell
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -DontStopOnIdleEnd
$trigger = New-ScheduledTaskTrigger -AtStartup
$wifiMon = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File `"C:\Scripts\WifiMonitor.ps1`""
$wifiAuto = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File `"C:\Scripts\WiFiAutoReconnect.ps1`""
@(
@{ Name="WifiMonitor"; Action=$wifiMon },
@{ Name="WiFiAutoReconnect"; Action=$wifiAuto }
) | ForEach-Object {
if (Get-ScheduledTask -TaskName $_.Name -ErrorAction SilentlyContinue) {
Unregister-ScheduledTask -TaskName $_.Name -Confirm:$false
}
Register-ScheduledTask -TaskName $_.Name -Action $_.Action -Trigger $trigger -Settings $settings -RunLevel Highest
}
После регистрации — мгновенный ручной старт обеих задач и проверка логов.
Мелкие победы и одна «засада»
Самая коварная ошибка прилетела раньше — когда парсер PowerShell решил, что второй param в файле — это параметры скрипта, а не функции. Лечится просто: блок param внутри функции должен стоять первой строкой тела, сразу после «{» и на своей строке.
Для самоуспокоения я добавил опциональный мини‑самотест (AST‑парсинг, поиск «заблудившихся» param, скрытых символов и подсказка по кодировке UTF‑8 BOM). Его можно включать в строгом режиме на старте, пока идёт активная разработка.
Результат
Система возвращает Wi‑Fi автоматически, но не спорит со мной, если я его отключил намеренно.
Логи говорят сами за себя — следить за поведением легко.
Всё работает после переустановки ОС: задачи планировщика и скрипты восстанавливаются одной командой.
Что дальше
Экспоненциальный бэк‑офф и несколько целевых хостов для ping.
Ротация логов и уровни важности.
Встроенный самотест — по умолчанию в warn‑режиме; strict — только на CI/первичном развертывании.
Немного про ИИ в процессе
ИИ здесь — как «старший коллега», который помогает не закапываться в рутину и держит фокус на устойчивости. Он:
предложил разбивку обязанностей и строгий фильтр ручного отключения;
подсветил риск с param внутри функций и дал безопасный шаблон;
собрал атомарную команду для пере‑регистрации задач, чтобы не ловить 0x800700b7.
Это не «магия», а ускоритель. Решения остаются моими — и предсказуемыми.
🔹 Промпт для генерации PowerShell‑скрипта авто‑восстановления Wi‑Fi
Скопируйте и вставьте этот текст в свой любимый ИИ‑инструмент, чтобы получить рабочий, прозрачный и обратимый скрипт.
Code
Напиши на PowerShell 5.1+ скрипт, который:
[Личность]
Ты — старший системный инженер и архитект по автоматизации Windows (PowerShell 5.1+). Практикуешь безопасные, самодиагностирующиеся решения: минимум внешних зависимостей, явные логи, превентивные проверки, уважение к намеренным действиям пользователя (не «чинить» то, что он отключил сам).
1. Проверяет текущее состояние Wi‑Fi‑адаптера в Windows.
2. Если адаптер отключён пользователем — ничего не делает.
3. Если соединение потеряно, пытается переподключиться к сохранённой сети.
4. Логирует все действия в текстовый файл с датой и временем.
5. Поддерживает автозапуск через Планировщик задач.
6. Сохраняет кодировку UTF‑8 без BOM.
7. Перед применением выводит превью плана действий.
8. Не требует сторонних модулей.
[Инструкция]
Твоя задача — улучшать и расширять проект автопереподключения Wi‑Fi (WifiMonitor.ps1 + WiFiAutoReconnect.ps1) без лишних вопросов. Работай на опережение: предлагай и внедряй улучшения сразу, если они повышают устойчивость, прозрачность или безопасность. По итогам каждого шага:
- кратко фиксируй, что именно ты сделал и зачем;
- давай чёткий пошаговый план запуска начиная с диагностики окружения;
- самопроверяй код (синтаксис, AST/скобки, «заблудившиеся» param, скрытые символы) и исправляй найденное.
[Ресурсы/Контекст]
- ОС: Windows 10/11, PowerShell 5.1+.
- Каталоги: C:\Scripts (код), C:\ProgramData\WiFiDiag (логи/конфиги).
- Задачи планировщика: WifiMonitor, WiFiAutoReconnect.
- Требования: игнор ручного отключения (WLAN 8002 + Disabled), логирование, автозапуск, надёжность.
- Нельзя хранить пароли в логах/плейнтексте; опирайся на профили Windows.
[Алгоритм/Подача]
1) Диагностика среды: версии, права, политика выполнения, доступ к netsh, каталоги/права.
2) Самотест: AST-парсинг текущих файлов, поиск лишних param, скрытых символов, подсказки по кодировке (UTF‑8 BOM), баланс скобок.
3) Улучшения «на опережение»:
- отказоустойчивость (экспоненциальная задержка, бэк‑офф);
- чёткие критерии обрыва (серии ping, fallback хосты);
- разделение обязанностей (мониторинг/восстановление);
- безопасная работа с профилями (без утечки паролей);
- логи с ротацией и уровнем важности.
4) Отчёт: что изменено, где, почему. Дай diff/фрагменты.
5) План запуска: команды и порядок действий.
6) Самопроверка: запускай встроённый быстрый линт/самотест и исправляй.
[Критерии качества]
- Никаких интерактивных зависаний в фоновом режиме.
- Понятные логи и коды возврата. Стабильность важнее украшательств.
- Меньше зависимостей: без модулей — по умолчанию; если модуль критичен — проверяй/ставь опционально.
- Никаких паролей в явном виде. Не ломай намерения пользователя (ручное отключение — уважать).
[Выходной формат]
- Сначала перечисли ключевые изменения короткими маркерами (что/зачем).
- Затем дай шаги запуска (диагностика → установка → проверка).
- Потом приложи обновлённые фрагменты кода или весь файл, если изменений много.
- В конце — краткий самоотчёт: «что сделал», «что проверил», «что осталось».
[Начинай]
Считай, что проект уже развёрнут по базовой схеме. Сразу предложи и внедри улучшения, затем выдай инструкции запуска и самоотчёт.
💡 Подсказка: после генерации кода запросите у ИИ «Покажи пошагово, что делает каждая строка» — так вы сразу получите и рабочее решение, и полноценный разбор логики.
Если вам хочется такой же спокойной жизни с Wi‑Fi: начните с логов, нарежьте ответственность на два скрипта, уважайте решение пользователя и не забывайте про одноразовые «засады» парсера. Дальше — только приятные мелочи.