网络驱动器自动检测脚本 · 使用说明

一、解决的问题

当 VM17 中的 Ubuntu 虚拟机未正常启动时,Windows 资源管理器里会残留一个「断开状态」的 Samba 网络驱动器图标。鼠标悬停该图标时,资源管理器 / 任务管理器会卡死。

本脚本配合 Windows 任务计划程序周期性运行,自动维护该网络驱动器:

检测到的情况 脚本动作
已连接且可访问 不做处理
服务器可达,但映射缺失或断开 用配置的账号密码自动重连 / 重建映射
服务器不可达(虚拟机未启动) 删除映射并清除持久化记录,坏图标不再残留

二、文件说明

脚本链接:

1
https://github.com/scnable/tool/tree/main/win10_shell
文件 说明
check-network-drive.ps1 主检测脚本(核心)
install-task.ps1 一次性注册定时任务(每 5 分钟运行一次)

三、特性说明

兼容性

  • 使用 net use 输出解析检测映射状态,不依赖 Get-SmbMapping(该 cmdlet 在 Windows 家庭版中不可用),兼容 Win10/Win11 所有版本。

瞬断容错

  • 服务器探测失败后会重试 3 次(间隔 2 秒),避免因 WiFi 瞬时波动等临时网络问题误删映射。

超时保护

  • 所有对网络路径的访问均有超时控制,即使 SMB 服务在探测过程中变为不可达,也不会长时间阻塞。

日志管理

  • 日志写入 %TEMP%\netdrive-check.log,单文件超过 5MB 后自动轮转,保留最近 3 份历史日志(.1.2.3),防止长期运行撑满磁盘。

错误诊断

  • 重连失败时会记录 net use 的具体退出码和错误信息,方便排查问题。

四、配置步骤

1. 修改主脚本的配置区

用记事本打开 check-network-drive.ps1,修改文件顶部的配置区:

1
2
3
4
5
6
7
8
9
10
11
12
$Mapping = @{
Drive = 'Z:' # 要映射到的本地盘符
UNC = '\\192.168.xxx.xxx\share' # 改成 VM17 Ubuntu 的 IP 和 Samba 共享名
User = 'samba_user' # 改成 Samba 用户名
Pass = 'samba_password' # 改成 Samba 密码
}
$LogPath = Join-Path $env:TEMP 'netdrive-check.log' # 日志文件路径
$TimeoutMs = 3000 # 服务器探测超时(毫秒)
$RetryCount = 3 # 探测失败重试次数
$RetryDelaySecs = 2 # 每次重试间隔(秒)
$LogMaxSizeBytes = 5MB # 日志轮转大小阈值
$LogMaxBackups = 3 # 保留历史日志份数

保存时请保持「UTF-8 编码」(记事本默认即可),否则中文注释可能乱码。

2. 手动测试主脚本

打开 PowerShell(普通窗口即可),执行:

1
2
cd C:\你存放脚本的目录
powershell -NoProfile -ExecutionPolicy Bypass -File .\check-network-drive.ps1
  • 虚拟机开着 → 日志出现 [OK] Z: -> \\... 已连接且可访问
  • 虚拟机没开 → 日志出现 [删除] 服务器不可达... 已删除映射 Z:,资源管理器中的坏图标消失
  • 瞬时网络波动 → 日志出现 [重试] 第 1/2 次重试服务器探测...,恢复后自动重连
  • 虚拟机从关到开 → 日志出现 [重连] 成功:Z: -> \\...

日志文件位置:%TEMP%\netdrive-check.log(即 C:\Users\<用户名>\AppData\Local\Temp\netdrive-check.log)。

3. 注册定时任务

在 PowerShell 中执行(需要以普通用户身份,无需管理员):

1
powershell -ExecutionPolicy Bypass -File .\install-task.ps1

看到「已注册定时任务 NetDriveCheck」即成功。任务将在 1 分钟后首次运行,之后每 5 分钟自动检测一次。

安装脚本会自动检查 check-network-drive.ps1 是否存在于同目录,若不存在则报错退出。

五、常见问题

  • 修改了配置后没有生效? 重新运行一次主脚本即可;定时任务无需重装,它每次都是重新读脚本。
  • 想改检测频率? 编辑 install-task.ps1-RepetitionInterval (New-TimeSpan -Minutes 5) 的数值,然后重新运行安装脚本。
  • 如何卸载定时任务? 在 PowerShell 中执行 Unregister-ScheduledTask -TaskName 'NetDriveCheck' -Confirm:$false
  • 密码想更安全? 可改用 Windows 凭据管理器(cmdkey /add:<IP> /user:<用户名> /pass:<密码>)保存凭据,然后把脚本配置区里 Pass 留空并删掉重连时的密码参数。
  • 任务计划程序里「上次运行结果」为 1? 这是正常的:0 表示连接正常,1 表示服务器不可达并已清理,均为预期结果。
  • 日志文件占用太多空间? 脚本已内置轮转机制,超过 5MB 自动归档,最多保留 3 份历史日志,无需手动清理。
  • 家庭版 Windows 能用吗? 可以。脚本使用 net use 输出解析检测映射状态,不依赖 Get-SmbMapping,兼容所有 Windows 10/11 版本。