如何通过脚本自动化扫描局域网共享并重新连接断开的共享驱动器?
如何通过脚本自动化扫描局域网共享并重新连接断开的共享驱动器?
完全懂你这种反复手动重连共享驱动器的痛苦!我之前也被这个问题折腾过,后来写了几个脚本解决,给你分享几个实用的方案,涵盖Windows环境下的PowerShell和批处理脚本,按需选择:
方案一:PowerShell脚本(功能更全面)
这个脚本不仅能重新连接已断开的映射驱动器,还可以扫描局域网内的设备,尝试连接你预设的共享路径。把下面的代码保存为ReconnectShares.ps1,记得根据你的实际情况修改共享路径和网段:
# 获取所有状态异常的网络驱动器(DriveType=4代表网络驱动器) $disconnectedDrives = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=4 AND ProviderName IS NOT NULL" | Where-Object { $_.Status -ne "OK" } # 替换成你常用的共享路径,比如公司服务器、NAS的共享 $sharedPaths = @("\\ServerName\TeamDocs", "\\192.168.3.20\Backup", "\\HomeNAS\Media") # 先处理已断开的现有映射驱动器 foreach ($drive in $disconnectedDrives) { $targetShare = $drive.ProviderName if ($sharedPaths -contains $targetShare) { Write-Host "正在重新连接: $targetShare (驱动器号: $($drive.DeviceName))" # 执行重连,/persistent:yes让驱动器在重启后保持映射 net use $drive.DeviceName $targetShare /persistent:yes } } # 可选功能:扫描局域网内的在线设备,尝试连接预设共享 # 替换成你的局域网网段,比如192.168.3.* $subnetPrefix = "192.168.3." for ($i=1; $i -le 254; $i++) { $currentIP = $subnetPrefix + $i # 快速ping检测设备是否在线 if (Test-Connection -ComputerName $currentIP -Count 1 -Quiet -TimeoutSeconds 1) { Write-Host `n"发现在线设备: $currentIP" try { # 获取该设备的共享列表(跳过系统默认的管理共享) $deviceShares = Get-WmiObject -Class Win32_Share -ComputerName $currentIP -ErrorAction Stop | Where-Object { $_.Name -notin @("ADMIN$", "C$", "IPC$") } foreach ($share in $deviceShares) { $fullSharePath = "\\$currentIP\$($share.Name)" if ($sharedPaths -contains $fullSharePath) { # 检查该共享是否已映射,未映射则自动连接 if (-not (Get-WmiObject Win32_LogicalDisk -Filter "ProviderName='$fullSharePath'")) { Write-Host "映射新共享: $fullSharePath" net use * $fullSharePath /persistent:yes } } } } catch { Write-Host "无法访问$currentIP的共享资源(可能权限不足或设备未开启共享): $_" } } }
使用说明:
- 右键以管理员身份运行PowerShell,然后执行
. .\ReconnectShares.ps1(注意第一个点后面有空格)。 - 如果共享需要验证身份,建议提前在Windows「凭据管理器」里保存对应的用户名和密码,这样脚本就能自动使用凭证,不用明文写密码。
方案二:批处理脚本(轻量简洁)
如果你觉得PowerShell太复杂,这个批处理脚本更简单直接,适合快速执行:
@echo off setlocal enabledelayedexpansion :: 替换成你的共享路径,用空格分隔 set "SHARE_LIST=\\ServerName\TeamDocs \\192.168.3.20\Backup \\HomeNAS\Media" :: 遍历共享列表,检查并重新连接 for %%s in (%SHARE_LIST%) do ( :: 检查该共享是否已映射 net use | findstr /i "%%s" >nul if errorlevel 1 ( echo [INFO] 正在重新连接共享: %%s net use * "%%s" /persistent:yes ) else ( echo [INFO] 共享%%s已经处于连接状态 ) ) :: 可选:简单扫描局域网在线设备 set "SUBNET=192.168.3." echo. echo [INFO] 正在扫描局域网设备... for /l %%i in (1,1,254) do ( ping -n 1 -w 100 !SUBNET!%%i >nul if not errorlevel 1 ( echo [FOUND] 在线设备: !SUBNET!%%i ) ) pause
使用说明:
- 把代码保存为
ReconnectShares.bat,右键以管理员身份运行即可。 - 同样,提前在凭据管理器保存共享的账号密码,避免每次运行都弹窗输入。
额外优化:定时自动执行
为了彻底解放双手,可以用Windows「任务计划程序」设置脚本定时运行:
- 打开「任务计划程序」,创建基本任务。
- 设置触发条件(比如每天固定时间、或者当网络连接到你的局域网时)。
- 操作选择「启动程序」,选择你的脚本文件(PowerShell脚本需要设置程序为
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\路径\ReconnectShares.ps1")。 - 勾选「使用最高权限运行」,确保脚本有足够权限。
备注:内容来源于stack exchange,提问作者Katto Ishimura




