July 18, 2007, 9:35 PM — Attaching a remote drive or directory on a Windows box is called "drive mapping" though the process is essentially the same as what we call mounting in the Unix world. While I rarely spend any significant time working on the Windows end of a Samba connection, I recently had an opportunity to assist a user who was tired of repeatedly having to manually connect directories from a couple of Solaris servers equipped with samba for sharing directories with select Windows desktops.
The solution was to whip up a batch file that mapped the drives on login. Batch files, though far less sophisticated than their Unix shell script counterparts, nonetheless have many of the important features that I have become accustomed to working with on my Unix systems. These include such things as redirection, testable return codes, the ability to test for the existence of a file and the equivalent of /dev/null for discarding command output, errors and all.
Batch files can include comments (lines that stat with "REM" for remark or the less distracting "::"). They provide a looping mechanism that uses the syntax "FOR %%VAR IN (LIST) DO". They provide a command (CHOICE) that works like a case statement. There is even a FIND command that works like grep. While the language still seems primitive in comparison to bash and perl, I was surprised that I was easily able to write a script that did what I needed it to do and automate the process. Admittedly, it was splattered with GOTOs -- something that would have horrified my CS professors from decades ago. Still, it was a functional language and I was pleased that I managed to mimic what I would have done on a Solaris or Linux system on a Windows XP box.
The command that is used to map drives on a Windows box is called "NET USE". While there is a GUI process for mapping drives, I prefer to open a DOS command window to view and modify my drive mappings to any point and click operation.
NET USE without arguments prints a list of the drives that are mapped along with any that were previously mapped and since disconnected. The command is similar to the Unix mount command.
|
-------------------------------------------------------------------------------
OK L: \\central\Library Microsoft Windows Network
Unavailable M: \\bigserver\shs Microsoft Windows Network
Disconnected P: \\bug-tracker\projects Microsoft Windows Network
OK R: \\smokey\reports Microsoft Windows Network
Instead of using mount points to connect drives to a system, Windows systems assign letters to each drive. So you can have an alphabet's worth of mappings at any point in time. A:, C: and D: are generally assigned to (frequently absent) floppy drives, the system's hard disk and CDROM. You are free to use the others however you see fit.
To map a drive, use the syntax "NET USE <letter> \\host\directory". For example, "NET USE R: \\smokey\reports". To supply a username and password with the NET USE command, you can add it on the command line like this:
|
Return codes in batch are stored in a variable named %ERRORLEVEL% (or "ERRORLEVEL"). Much like you might test for the successful completion of a command in a bash script by looking at $?, you can determine whether a batch command was successfully executed by evaluating the content of %ERRORLEVEL%. Here's an example:
|
The capitalization is arbitrary. You could also do the same thing with "if not errorlevel 0 goto oops".
Putting this together, we might try to map a drive and then check whether the mapping was successful:
|
Since "stale" drive mapping associations might interfere with your attempt to map the drive afresh, however, you might need to delete a drive mapping before reinstating it. To avoid sending alarming messages to your use, however, you might want to squelch any messages that would be displayed if you tried to delete a drive that wasn't currently mapped.
No problem:
|














