Windows 断网修复脚本

@echo off
setlocal EnableExtensions EnableDelayedExpansion
title Windows Network Deep Repair (Windows 10/11)

:: --- Self-elevate to admin ---
net session >NUL 2>&1
if errorlevel 1 (
  echo Requesting administrative privileges...
  powershell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
  exit /b
)

:: --- Options (1=enable, 0=disable) ---
set "ENABLE_FIREWALL_RESET=1"
set "ENABLE_HOSTS_RESET=1"
set "ENABLE_DELETE_WIFI_PROFILES=0"   :: if set to 1, ALL saved Wi-Fi profiles are removed
set "ENABLE_HEALTH_REPAIR=1"          :: DISM + SFC

:: --- Log file ---
for /f %%i in ('powershell -NoProfile -Command "(Get-Date).ToString(\"yyyyMMdd_HHmmss\")"') do set "TS=%%i"
set "LOG=%TEMP%\Net_DeepRepair_%TS%.log"
echo --- Windows Network Deep Repair started %DATE% %TIME% --- > "%LOG%"
call :log "Logging to: %LOG%"

:: --- Inventory / snapshot ---
call :log "Collecting environment info..."
ver >> "%LOG%"
ipconfig /all >> "%LOG%"
route print >> "%LOG%"
netsh winsock show catalog >> "%LOG%" 2>&1
netsh winhttp show proxy >> "%LOG%" 2>&1

:: --- Clear user & system proxies ---
call :log "Resetting system and user proxy settings..."
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f >> "%LOG%" 2>&1
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /f >> "%LOG%" 2>&1
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f >> "%LOG%" 2>&1
netsh winhttp reset proxy >> "%LOG%" 2>&1

:: --- Reset HOSTS to Windows default (backup first) ---
if "%ENABLE_HOSTS_RESET%"=="1" (
  call :log "Resetting HOSTS file to Windows default (backup first)..."
  set "HOSTS=%SystemRoot%\System32\drivers\etc\hosts"
  if exist "%HOSTS%" copy /y "%HOSTS%" "%HOSTS%.bak.%TS%" >nul 2>&1
  attrib -r -s -h "%HOSTS%" >nul 2>&1
  (
    echo # Default Windows HOSTS file
    echo # localhost name resolution is handled within DNS itself.
    echo # 127.0.0.1       localhost
    echo # ::1             localhost
  ) > "%HOSTS%"
)

:: --- Reset Winsock & TCP/IP (IPv4/IPv6) ---
call :log "Resetting Winsock and TCP/IP (IPv4/IPv6)..."
netsh winsock reset >> "%LOG%" 2>&1
netsh int ipv4 reset "%TEMP%\ipv4_reset_%TS%.log" >> "%LOG%" 2>&1
netsh int ipv6 reset "%TEMP%\ipv6_reset_%TS%.log" >> "%LOG%" 2>&1

:: --- Flush DNS, clear ARP, clear routes, renew IP ---
call :log "Clearing DNS, ARP cache and routing table; renewing IP..."
ipconfig /flushdns >> "%LOG%" 2>&1
arp -d * >> "%LOG%" 2>&1
route -f >> "%LOG%" 2>&1
ipconfig /release >> "%LOG%" 2>&1
ipconfig /renew >> "%LOG%" 2>&1

:: --- Ensure DHCP and automatic DNS on all active adapters ---
call :log "Ensuring DHCP and automatic DNS on all adapters..."
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"Get-NetIPInterface -AddressFamily IPv4 | Where-Object { $_.Dhcp -ne 'Enabled' } | ForEach-Object { Set-NetIPInterface -Dhcp Enabled -InterfaceIndex $_.InterfaceIndex }" >> "%LOG%" 2>&1
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"Get-DnsClient | Where-Object { $_.InterfaceAlias -notmatch 'vEthernet|Hyper-V|VMware|VirtualBox|TAP|VPN|Loopback|WSL|Bluetooth' } | ForEach-Object { Set-DnsClientServerAddress -InterfaceAlias $_.InterfaceAlias -ResetServerAddresses }" >> "%LOG%" 2>&1

:: --- Restart critical networking services ---
call :log "Starting critical networking services..."
for %%S in (bfe mpssvc Dhcp Dnscache nsi netprofm LanmanWorkstation LanmanServer iphlpsvc WinHttpAutoProxySvc) do (
  sc config %%S start= auto >> "%LOG%" 2>&1
  net start %%S >> "%LOG%" 2>&1
)

:: --- Backup & reset Windows Defender Firewall (optional) ---
if "%ENABLE_FIREWALL_RESET%"=="1" (
  call :log "Backing up and resetting Windows Defender Firewall to defaults..."
  netsh advfirewall export "%TEMP%\FirewallPolicy_%TS%.wfw" >> "%LOG%" 2>&1
  netsh advfirewall reset >> "%LOG%" 2>&1
)

:: --- Remove ALL saved Wi‑Fi profiles (optional deep cleanup) ---
if "%ENABLE_DELETE_WIFI_PROFILES%"=="1" (
  call :log "Deleting ALL saved Wi‑Fi profiles (you will need to re-enter Wi‑Fi passwords)..."
  netsh wlan delete profile name=* >> "%LOG%" 2>&1
)

:: --- Component store & system files repair (optional) ---
if "%ENABLE_HEALTH_REPAIR%"=="1" (
  call :log "Repairing component store (DISM) and system files (SFC)..."
  DISM /Online /Cleanup-Image /RestoreHealth >> "%LOG%" 2>&1
  sfc /scannow >> "%LOG%" 2>&1
)

:: --- Final quick checks ---
call :log "Final connectivity tests..."
ping -n 2 1.1.1.1 >> "%LOG%" 2>&1 && call :log "ICMP to 1.1.1.1: OK" || call :log "ICMP to 1.1.1.1: FAILED"
nslookup www.microsoft.com >> "%LOG%" 2>&1 && call :log "DNS lookup (www.microsoft.com): OK" || call :log "DNS lookup (www.microsoft.com): FAILED"

call :log "Complete. A restart is recommended to finalize stack resets."
echo.
echo ===============================================================================
echo   Windows Network Deep Repair is complete.
echo   Log file: %LOG%
echo   A restart is recommended to finalize Winsock/IP resets.
echo ===============================================================================
echo.
choice /C YN /N /T 15 /D N /M "Reboot now? [Y/N] "
if errorlevel 2 goto :end
if errorlevel 1 shutdown /r /t 5 /c "Windows Network Deep Repair completed"
goto :eof

:log
set "MSG=%~1"
echo [%DATE% %TIME%] %MSG%
>>"%LOG%" echo [%DATE% %TIME%] %MSG%
goto :eof

:end
exit /b 0