Skip to content

Instantly share code, notes, and snippets.

@BattleNonSense
Last active June 30, 2023 07:40
Show Gist options
  • Star 73 You must be signed in to star a gist
  • Fork 22 You must be signed in to fork a gist
  • Save BattleNonSense/fb27377bc8a0ca2e9c58f28924ce277b to your computer and use it in GitHub Desktop.
Save BattleNonSense/fb27377bc8a0ca2e9c58f28924ce277b to your computer and use it in GitHub Desktop.
Automatically reconnect Network Drives in Windows
@echo off
setlocal enabledelayedexpansion
REM This is version 2 of the script. Completely changed how it detects off-line network drives since the old method caused issues for some people.
echo RECONNECT OFFLINE NETWORK DRIVES
echo //Created by Battle(non)sense - https://www.youtube.com/BattleNonSense
echo --------------------------------------------------------------------
echo This script is a workaround for the 'Could not connect all network drives' issues in Windows, where an 'offline' network drive can still be accessed inside windows explorer.
echo --------------------------------------------------------------------
REM We need to wait for the network to get ready first
echo .
echo Waiting for Network
set LC=0
goto :waitfornet_
:waitfornet
timeout /t 1 /NOBREAK >nul
:waitfornet_
route print -4 | findstr /C:" 0.0.0.0 " >nul 2>nul
if not errorlevel 1 goto :NetReady
set /A LC=%LC%+1
if %LC% LSS 30 goto :waitfornet
goto :eof
:NetReady
REM Once the network is ready we need to wait a bit before the next step or it might fail on some PC's
echo .
echo Network online
timeout /t 5 /nobreak >nul
goto :RefreshNetDrives
:RefreshNetDrives
REM Now we create a list of all network drives that are not 'OK'
echo .
echo Searching for Offline Network Drives:
set "OfflineNetDrives_cnt=0"
net use | findstr /b /v OK |findstr "A:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=A:"
)
net use | findstr /b /v OK |findstr "B:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=B:"
)
net use | findstr /b /v OK |findstr "C:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=C:"
)
net use | findstr /b /v OK |findstr "D:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=D:"
)
net use | findstr /b /v OK |findstr "E:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=E:"
)
net use | findstr /b /v OK |findstr "F:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=F:"
)
net use | findstr /b /v OK |findstr "G:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=G:"
)
net use | findstr /b /v OK |findstr "H:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=H:"
)
net use | findstr /b /v OK |findstr "I:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=I:"
)
net use | findstr /b /v OK |findstr "J:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=J:"
)
net use | findstr /b /v OK |findstr "K:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=K:"
)
net use | findstr /b /v OK |findstr "L:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=L:"
)
net use | findstr /b /v OK |findstr "M:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=M:"
)
net use | findstr /b /v OK |findstr "N:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=N:"
)
net use | findstr /b /v OK |findstr "O:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=O:"
)
net use | findstr /b /v OK |findstr "P:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=P:"
)
net use | findstr /b /v OK |findstr "Q:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=Q:"
)
net use | findstr /b /v OK |findstr "R:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=R:"
)
net use | findstr /b /v OK |findstr "S:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=S:"
)
net use | findstr /b /v OK |findstr "T:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=T:"
)
net use | findstr /b /v OK |findstr "U:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=U:"
)
net use | findstr /b /v OK |findstr "V:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=V:"
)
net use | findstr /b /v OK |findstr "W:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=W:"
)
net use | findstr /b /v OK |findstr "X:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=X:"
)
net use | findstr /b /v OK |findstr "Y:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=Y:"
)
net use | findstr /b /v OK |findstr "Z:"
if not errorlevel 1 (
set /a OfflineNetDrives_cnt+=1
set "OfflineNetDrives[!OfflineNetDrives_cnt!]=Z:"
)
echo !OfflineNetDrives_cnt! OFFLINE Network Drives found
echo .
REM Now we use the windows explorer to access each OFFLINE Network share
echo Reconnecting All Network Shares:
for /L %%n in (1 1 !OfflineNetDrives_cnt!) DO ( echo !OfflineNetDrives[%%n]! & Start /min explorer "!OfflineNetDrives[%%n]!")
goto :CleanUp
:CleanUp
REM Explorer needs a bit to open all windows and access the drives, so we have to wait a bit
timeout /t 5 /nobreak >nul
echo .
REM Now we close the explorer windows which we opened before
echo Cleanup: Closing Explorer windows
for /L %%n in (1 1 !OfflineNetDrives_cnt!) DO (
for /f "tokens=2 delims=," %%a in ('tasklist /fi "imagename eq explorer.exe" /v /fo:csv /nh ^| findstr /r "!OfflineNetDrives[%%n]!"') do (echo !OfflineNetDrives[%%n]! & taskkill /pid %%a)
)
echo .
echo Done
timeout /t 5 /nobreak >nul
@Zaidy036
Copy link

Can simplify Cleanup: Closing Explorer windows using following in place of 185-187:
"C:\Program Files\nircmd-x64\nircmd.exe" win close class "CabinetWClass"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment