# How can I extract the drive letter for a new mapped drive in a .bat?

I'm creating a simple command-line backup script to use robocopy to mirror "important" stuff to my NAS box. I would prefer not to rely on a hard-coded mapped drive letter for that NAS box. In the script I would like to map a temporary drive letter, copy the relevant files, and dispose of the mapped drive. I don't want to assume that if that drive letter is already mapped, that it's pointing to the place I expect. I also don't want to "assume" that some drive letter is available when I map the drive, thus the leading '*'.

    net use * \\nasbox\sharename password /user:username /persistent:no


What's the proper way within my .bat script to extract that drive letter for use in subsequent commands? I was thinking that I could piece together some variant of "for"'s token-parsing, but I also suspect there must be an easier way than esoteric for-syntax.

    C:\>net use * \\nasbox\sharename password /user:username /persistent:no
Drive Z: is now connected to \\nasbox\sharename.

The command completed successfully.

C:\>


Once I have the mapped drive letter, I would like to follow up with commands along the lines of:

    robocopy C:\path\to\important\stuff %NewDrive%\path\to\backup /MIR /Z

-
Interesting question in the general case, and a good accepted answer, but wouldn't it be better tojust use the UNC name in the Robocopy command? robocopy C:\path\to\important\stuff \\nasbox\sharename\path\to\backup /MIR /Z – Neal Oct 23 '09 at 1:24
Hmm, now that's an interesting proposition, and one I should have considered first. Since roboycopy supports UNC paths (just tested it), then yes, I'll switch to that form instead. Having said that, I suspect I'll continue to find use for the pushd/popd pattern, regardless. +1 – JMD Oct 23 '09 at 14:51

Use the commands pushd and popd.

pushd \\server\share will create a temporary drive (starting from Z: and going backwards till it finds an available letter) and go into it. When you're done, popd will delete the temporary drive and get you back where you were.

C:\Users\Snark>pushd /?
Stores the current directory for use by the POPD command, then
changes to the specified directory.

PUSHD [path | ..]

path        Specifies the directory to make the current directory.

If Command Extensions are enabled the PUSHD command accepts
network paths in addition to the normal drive letter and path.
If a network path is specified, PUSHD will create a temporary
drive letter that points to that specified network resource and
then change the current drive and directory, using the newly
defined drive letter.  Temporary drive letters are allocated from
Z: on down, using the first unused drive letter found.

C:\Users\Snark>popd /?
Changes to the directory stored by the PUSHD command.

POPD

If Command Extensions are enabled the POPD command will delete
any temporary drive letter created by PUSHD when you POPD that
drive off the pushed directory stack.

-
That's brilliant, Snark. Thanks. – JMD Oct 21 '09 at 21:09

And, for posterity, here's a rough template of how that all works out. Thanks again to @Snark, and @Neal.

Here's my original template, using pushd/popd.

    @echo off

:: Supply credentials for the NAS share.
:: Make sure it worked.
if ERRORLEVEL 1 echo NET USE returned %ERRORLEVEL% && goto :EOF

:: Use pushd to supply a drive letter for the share.
pushd \\nasbox\sharename

:: Copy the files to be backed up. Rinse and repeat.
robocopy C:\path\to\important\stuff .\path\to\backups /MIR /Z

:: Release the temporary drive letter.
popd

:: Optionally, revoke the credentials while the share's not in use.
net use \\nasbox\sharename /delete


Note, that with my revelation from @Neal's comment, my specific application of pushd/popd are unnecessary here, and the form of the robocopy command simply changes to:

    robocopy C:\path\to\important\stuff \\nasbox\sharename\path\to\backups /MIR /Z


No need to vote this up. Just wanted to have it here as a bread crumb for others who find this later.

-
+1 Because this worked for me - ta. – Umber Ferrule Oct 23 '09 at 11:49