О том, как я приручил Wi‑Fi с помощью PowerShell и чуть‑чуть ИИ

от автора

Задача

Дома и в командировках меня раздражали внезапные «тихие» обрывы 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: начните с логов, нарежьте ответственность на два скрипта, уважайте решение пользователя и не забывайте про одноразовые «засады» парсера. Дальше — только приятные мелочи.


ссылка на оригинал статьи https://habr.com/ru/articles/938302/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *