Silent Nomad
A traveller with a camera!
home
blog
about
contact

Reconnect mapped network drives using Command Prompt batch script, and using Lightroom Classic catalogues on a network

I use Adobe Photoshop and Adobe Lightroom Classic (LrC) for my photographic workflow on Windows 10. I keep my photos on my NAS, and access these from my Windows PC workstation using a 10GbE network. It’s pretty fast as the NAS drives are in a RAID10 (1+0) configuration with 8 HDD drives so that 10GbE bandwidth is well utilised. I also keep my LrC catalogues on the NAS drive so that I can use one of my other PCs to access the catalogues, but LrC will not allow you to use network folders for storing catalogues. I believe that Adobe state that this is because of poor network performance and concerns on multiuser access; both of which are not relevant to my use case so Adobe’s barriers, although well-intentioned, actually stink.

Luckily, LrC will not detect that a catalogue is on a network if you use the SUBST command within Windows 10 to map the catalogue folder to a drive. Using LrC with WiFi is not a very good user experience, so if you want to put your LrC catalogues on a network share, I’d recommend a wired Ethernet connection instead of WiFi; 10GbE is preferred but GbE is workable. My main use case is LrC catalogues accessible over the LAN, but I obviously use my NAS for storing all my other documents so mapping network drives is very useful for those other use cases.

I use Windows “Map network drive” option within Windows Explorer to map all the other folders on my NAS for generic access, and is the preferred way of mapping network shares within Windows. However, when booting into Windows, the OS sometimes does not reconnect mapped network drives even though the mapping is configured with the “Reconnect at sign-in” option. This is due to various timing constraints of resources during boot. Although free Third-Party applications are available that can automatically reconnect your mapped network drives, I would rather to do this using Windows built-in tools than add more unnecessary software to my system. I’ve therefore put-together a Command Prompt batch script using the “NET USE” and “SUBST” commands which runs in Windows 10 Pro 64-bit. It’s robust and reliable, but it does depend on the implementation of your LAN (use 10GbE where possible).

The script is saved as a .CMD batch file which is executed twice by the Task Scheduler at user log on; one in non-admin mode, and the other in admin mode (run in highest privileges). This allows a mapped drive to be visible to those applications running in non-admin modes and also to those applications running in admin modes. I also used the CMDKEY command at the Command Prompt (not in a batch script) to add my network share credentials so that I didn’t have to add the credentials to the NET USE command; this just needs to be run once. The CMDKEY format was:

cmdkey /add:192.168.49.69 /user:username /pass:password

Or you can use the Windows “Credential Manager” and add these credentials within the “Windows Credentials” section; a lot easier to use than the command line!

The full batch script is below. Of course, use your own NAS IP address and your own preferred drive letters. For me, D is for Data (where all my files are kept), and L is for Lightroom (where my Catalogues are kept).

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET me=%~n0
SET parent=%~dp0

TITLE Mapping network drives
@ECHO Please wait whilst we connect your drives
TIMEOUT /t 1 /NOBREAK >NUL

:Start
ECHO _____________________________________

IF EXIST D:\NUL (
    ECHO:
    ECHO D: drive is already mapped
    GOTO Subst_drive
) ELSE (
    ECHO:
    ECHO D: drive does not exist
)

:NetUse
IF EXIST \\192.168.49.69\Data\ (
    ECHO:
    ECHO NAS folder exists so run NET USE command
    NET USE D: \\192.168.49.69\Data /PERSISTENT:YES
) ELSE (
    ECHO:
    ECHO NAS folder does not exist
    GoTo ErrorPrompt
)

IF "%ERRORLEVEL%" NEQ "0" (
    IF "%ERRORLEVEL%" NEQ "2" (
        ECHO:
        ECHO NET USE returncode has error and is %ERRORLEVEL%
        GOTO ErrorPrompt
    )
) ELSE (
    ECHO:
    ECHO NET USE returncode should be 0 and is %ERRORLEVEL%
)

:Subst_drive
IF EXIST "\\192.168.49.69\Data\Documents\LR catalogs" (
    ECHO:
    ECHO Lightroom catalog folder exists so run SUBST command
    SUBST L: "\\192.168.49.69\Data\Documents\LR catalogs"
) ELSE (
    ECHO:
    ECHO Lightroom catalog folder does not exist
    GOTO ErrorPrompt
)

IF "%ERRORLEVEL%" NEQ "0" (
    IF "%ERRORLEVEL%" NEQ "1" (
        ECHO:
        ECHO SUBST returncode has error and is %ERRORLEVEL%
        GOTO ErrorPrompt
    )
) ELSE (
    ECHO:
    ECHO SUBST returncode should be 0 and is %ERRORLEVEL%
    GOTO Endofscript
)

REM catchall
GOTO Endofscript

:ErrorPrompt
ECHO _____________________________________
ECHO:
SET /P userinput="Errors were found. Do you wish to try again [Y/n] "
IF /I "%userinput%" EQU "y" GOTO Start
IF /I "%userinput%" EQU "" GOTO Start
IF /I "%userinput%" EQU "n" GOTO Endofscript
GOTO ErrorPrompt

:Endofscript
ECHO _____________________________________
ECHO:
@ECHO Please wait, script is closing.
TIMEOUT /t 5 /NOBREAK >NUL
rem pause
ENDLOCAL
@ECHO OFF
@EXIT /B 0