How to mount and unmount hard drives under Windows (the unix way)

On my work computer I have two USB hard drives that I use rarely. They have a power save mode that sends them into sleep after a couple of minutes of them being idle.

Whenever I open a context menu on a file, the drives are woken up (most likely caused by the "send to" handler). So I eject the drive, but I can't find a way to get it back, other than unplugging and replugging it in.

Is there a way to unmount the drives, and then remount them only when I actually need them? (On Windows 7 Ultimate.)


Remove the drive letters using mountvol or diskmgmt.msc. Without a drive letter, they won't appear under Computer or Send To.

mountvol Q: /p

Using /p will actually dismount the device. On older Windows versions, you only have /d, which only unassigns the drive letter, but keeps the volume mounted.

Reassign when needed, using the volume ID printed by mountvol:

mountvol Q: \\?\Volume{1be3da43-6602-11e0-b9e6-f11e1c50f5b5}\

You can also mount the volume on an empty folder (Unix style) using the same tools:

mkdir C:\fs\backup-disk
mountvol C:\fs\backup-disk \\?\Volume{1be3da43-6602-11e0-b9e6-f11e1c50f5b5}\

All these operations require Administrator privileges.


(In fact, you might even be able to directly use the volume ID in your backup scripts, without having to mount it anywhere. For example, \\?\Volume{1be3da43-6602-11e0-b9e6-f11e1c50f5b5}\projects instead of Q:\projects.)


Use DISKPART to set your disk offline
It will stay offline even after a restart or a new power on

Use DISKPART to set it back online

This can be done in scripts

command file to put disk 2 offline:

Offline.cmd

 echo list disk              > c:\windows\temp\namexxxx.none
 echo select disk 2         >> c:\windows\temp\namexxxx.none
 echo offline disk          >> c:\windows\temp\namexxxx.none
 echo exit                  >> c:\windows\temp\namexxxx.none
 diskpart /s c:\windows\temp\namexxxx.none
 erase c:\windows\temp\namexxxx.none
 pause

command file to put disk 2 online:

Online.cmd

 .
 echo select disk 2 ........
 echo online disk ......
 .

Execute as administrator


The correct answer is using the /P parameter to mountvol (see the comments in the accepted answer to understand why /D is not enough) but that only applies to recent windows versions (NT kernel version 6 and up).

The devcon utility as described in this answer works across all NT versions


CMD doesn't have a function implemented to eject USB drives. It can, however call Win COM Objects which have the needed functions implemented eg. Shell.Application via powershell, VBS, JS, etc.

Alternatively (if you know how to interface with USB host), you may create an executable from Win CMD to send commands directly to USB or via (Windows) OS, then call/run it from CMD (similar to writing a COM object or Powershell commandlets).

In powershell from CMD:

powershell "$driveEject = New-Object -comObject Shell.Application; $driveEject.Namespace(17).ParseName(\"E:\").InvokeVerb(\"Eject\"); start-sleep -s 3"

Ejecting disk via powershell also requires it to be unplugged & plugged back in to be mounted again. Otherwise the disk can just be unmounted so it's inaccessible until it's mounted again by either mountvol or diskpart.

eg. with mountvol:

REM unmount
mountvol e: /D or /P
REM mount for access
mountvol e: \\?\Volume{device GUID in hex with hyphens}\

mountvol allows mounting devices to a folder eg. C:\fakedisk\ as well as a drive letter.

eg. With diskpart:

REM unmount
(
echo select volume 3
echo remove letter=e dismount
) | diskpart

REM mount again for access
(
echo select volume 3
echo assign letter=e
) | diskpart

Tested in Win 10 cmd