Remove USB device from command line

66

26

I'm constructing a backup script for Windows 7, and the last action I want it to perform is to safely "remove" the USB drive that it is backing up to. I am under the impression that plugging the drive into the same USB port all the time will keep the same DEV_ID (correct me if I'm wrong). With a command line (or PowerShell), how can I tell Windows to safely remove the hardware automatically without user input?

Just as a place holder, other OSes that may have a way to do this would be great to know as well.

Canadian Luke

Posted 2012-06-29T20:01:16.150

Reputation: 22 162

Could you update title to be correct. I was looking for answers on removing USB "devices" not USB "drives". – None – 2015-04-10T12:43:18.560

6I have to admit disappointment by some of the “answers” below which clearly did not understand what is being asked and provided options that are obviously useless for the task of automation as asked.` ಠ_ಠ – Synetech – 2013-12-05T03:39:58.767

ockquote>

I am under the impression that plugging the drive into the SAME USB port all the time will keep the same DEV_ID, correct me if I'm wrong. That is correct. Windows treats a drive and the port it’s plugged into as an identifying pair. By plugging it into a different port (in which it has never been plugged), you will trigger Windows’ driver-installation function. Worse, if you have assigned a non-consecutive drive-letter to the volume, then plugging it into a new port will not retain that letter, and it will get the next available letter and you must assign a letter manually again.

– Synetech – 2013-12-05T03:44:03.343

1(Oddly enough, if you plug a drive into a port and let Windows install drivers for it, then assign a non-consecutive drive-letter to it, then unplug it an plug in a different drive that is of the same make, model, and size, then Windows will treat it exactly as though you plugged in the previous drive again.) – Synetech – 2013-12-05T03:45:36.570

Answers

33

RemoveDrive has served me well in the past

stijn

Posted 2012-06-29T20:01:16.150

Reputation: 1 977

4removedrive\x64>RemoveDrive.exe f: -L is the code, for those who are in hurry – fedmich – 2014-08-09T07:31:11.090

This ended up working for me. Interestingly an WqlEventQuery I have wired up still waits to fire until you physically pull the drive out. Don't know a ton about this stuff, but it surprised me. Doesn't happen to be an issue for me in this case. – samuelesque – 2015-04-02T17:44:12.743

1RemoveDrive is good, but the problem is that it actually removes the whole drive. For card-readers, instead of simply ejecting the card (like right-clicking and selecting Eject from My Computer), and allowing you to plug another on in, it removes the whole card-reader, requiring it to be physically unplugged and re-plugged, or worse, rebooting if the card reader is built in (it is possible to do it through software but it is annoying). – Synetech – 2016-05-01T22:33:14.343

You can run it from cygwin too. – Kevin Sadler – 2017-11-11T13:54:05.253

67

Besides Uwe Sieber's RemoveDrive mentioned in the other answer, there are a whole bunch of utilities that can accomplish this. A small list follows:

  • USB Disk Ejector is primarily a GUI-based utility but can be used equally well from the command-line to eject the drive that the program is running from, or any drive by specifying the drive letter / (partial) drive name / mountpoint etc. Free and open source.

    USB Disk Ejector

  • USB Safely Remove is not free but it's a disk removal utility on steroids, with lots of advanced features, including of course command-line support. Zentimo is its bigger brother, with even more features.

    USB Safely Remove

  • Microsoft's own DevCon is the command-line version of Device Manager. Besides the original Win2K/XP-era version available from the KB page, there are newer releases (both 32 and 64-bit) available from various MS sources as mentioned in this Where to find DevCon.exe article. DevCon.exe for Windows 7 (and probably Windows 8 as well) can be found buried in the appropriate Windows Driver Kit (WDK), as mentioned in this thread (which also contains download links to the extracted executable).

    devcon status * or devcon hwids * or devcon findall =usb (for a more compact listing) should tell you the hardware ID of the device. For example:

    USB\VID_0781&PID_7113\0001162825
    Name: USB Mass Storage Device
    Driver is running.

    You can then try removing the device with devcon remove "USB\VID_0781&PID_7113" (wildcards like * are allowed, but be careful or you might end up removing something else entirely!)


Someone asked "Is there a DOS prompt (cmd.exe from Win7) command to eject a thumb drive?" which was unfortunately closed as a duplicate of this thread. However, the question was about ejecting USB drives while in the Windows Recovery Console / System Recovery Command Prompt, so it is unlikely any of the utilities above will help. In such a situation, the following method using Diskpart should work:

  1. Type diskpart and wait for the diskpart prompt (DISKPART>)

  2. Type list volume

  3. Note the volume number of the USB drive carefully (use listed properties such as drive letter, label, type and size for help)

  4. Type select volume <number>, where <number> is the volume number noted above

    Diskpart

  5. Type remove all dismount

  6. Type exit to quit Diskpart

Now you should be able to safely remove your USB drive without fear of data loss.

Karan

Posted 2012-06-29T20:01:16.150

Reputation: 51 857

i'd consider the last command to be the best as it doesn't require third-party software to implement the solution – None – 2014-11-20T03:34:06.183

I've tried this method but once I plug the usb again, the usb has no path. I have to assign it back from Device Manager. – CroCo – 2014-12-25T02:12:15.400

1

Thanks for taking time to respond to my question even after SU closed it. I went ahead and acted on Jared Tritsch's suggestion and removed the drive just by removing it. Once I get laptop operational again, I'll experiment with with DISKPART. Here's the link to Microsoft's Specs for DISKPART. http://technet.microsoft.com/en-us/library/bb490893.aspx

– zundarz – 2012-10-12T03:19:15.000

2

@zundarz: You're welcome! The default Removal policy in Windows for removable devices is Quick removal, which disabled write caching and allows one to remove the drive without needing to safely remove it first. See this screenshot for more. Thus Jared's suggestion about yanking the drive shouldn't ordinarily cause data loss if removable drives are treated the same way in the Recovery Console as well. Still, for peace of mind I always take care to safely remove each drive before pulling it out. Might be a placebo, but keeps me from worrying. :)

– Karan – 2012-10-12T04:28:01.943

P.S. Be careful with Diskpart - it's powerful and hence quite dangerous. The reason I used it for drive dismounting is because it's available from both XP's Recovery Console and Vista/7's System Recovery Options / Command Prompt. – Karan – 2012-10-12T04:38:40.373

I tried using Diskpart while in normal Windows mode. This is the message I get after performing step 5 above. "DiskPart successfully removed the drive letter, but your computer needs to be rebooted before the changes take effect. Diskpart successfully dismounted the volume." I tried using it on a removable media (SD card) rather than a removable device (such as the SD card reader or USB flash drive). The LED indicator on the reader didn't go off but it stayed lit (i.e. it stopped flashing as it occasionally does when a SD card only sits in it). So I guess it's safe to remove then. – Samir – 2013-05-25T18:04:22.270

My SD card reader shows up as "Removable Disk" in the Computer view (Explorer). So I guess what Diskpart did is it tried dismounting the reader itself, rather than the SD card inside it. I haven't tried it with an external disk drive. It might be different story there. But generally I think the reboot message from Diskpart can be ignored. – Samir – 2013-05-25T18:07:11.170

Reinserting the SD card in the reader didn't help. I tried to unplug the reader, plug it back in, and then insert the SD card again. The P: drive which is the one I select as volume when I did the remove dismounted all command in Diskpart didn't show up again in Explorer. But drive N: did show up. I have one of those dual-slot readers where N: is for CF cards and P: is for SD cards. The N: drive worked normally. – Samir – 2013-05-25T18:14:20.417

Diskpart is probably right then about the reboot. Reboot is required now for me to get back the P: drive to be able to read SD cards. But from safety point reboot is not required. It's safe to remove the media one you get that message. However, this shows that there's a difference in "ejecting" the "Removable Media" (SD, CF, et. al.) and "safely" removing things like "Removable Devices" (external HDD, UFD, et. al). – Samir – 2013-05-25T18:16:21.927

3

To undo the remove all dismount command you must use the mountvol command. For more information see Technet library here and also here. After you have used mountvol you must reboot for the changes to take effect. Alternatively, you can also use Disk Management to assign a new drive letter.

– Samir – 2013-05-26T12:44:17.880

None of these options really address the question that was asked. :-| They’re good, but belong in other questions about ejecting removable media, not this one. – Synetech – 2013-12-05T03:21:52.680

17

To answer to this question... You don't need third party stuff.

With a Command Line (or PowerShell), how can I tell Windows to safely remove the hardware automatically without user input?

Run this command: RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll to bring up the Safely Remove Hardware dialog box:

The Safely Remove Hardware Dialog

climenole

Posted 2012-06-29T20:01:16.150

Reputation: 3 180

control hotplug.dll also works, just to add to your answer – fedmich – 2014-08-09T07:27:42.980

1control hotplug.dll, i.e., without ___RunDLL__ doesn't work for me on Vista SP2 – user66001 – 2015-06-25T20:57:25.390

If you have to remember this command/don't like capitals much, all that is really needed (at least for me on Vista SP2) is to capitalise the Contol_RunDLL. I.e., rundll32.exe shell32.dll,Control_RunDLL hotplug.dll – user66001 – 2015-06-25T21:03:50.050

its because function names within *.dll libraries are case sensitive, unlike most of the things in Windows which are in-case-sensitive by default – None – 2017-10-25T10:14:41.707

While I'm delighted to not go 3rd party, and your description w/ images is excellent, it's failing. Win10 recognizes "Kingston DataTraveler 3.0 USB device" but upon clicking stop and OK, "The 'Kingston DataTraveler 3.0 USB device' is not removable and cannot be ejected or unplugged." Win7 sees "Generic- Compact Flash" but it reports success after Stop and OK. Yet when I immediately reissue command on W7 without touching the drive, this time it oddly now recognizes "Kingston DataTraveler 3.0 USB device", but upon Stop and OK, " [...] device is not removable and cannot be ejected or unplugged." – MicrosoftShouldBeKickedInNuts – 2019-05-17T01:04:06.747

4Can you describe what that does? – Canadian Luke – 2012-10-12T06:19:40.670

1launch the safe removal for usb – climenole – 2012-10-12T13:53:23.373

11Won't I still need to click something then? – Canadian Luke – 2012-10-12T14:54:48.827

@Luke I just tried that, it brings up the Safely Remove Hardware dialog. So yes, you would still need to select the device, click Stop button, and then Close to close the dialog box. Note that the command is case sensitive, so you have to type it exactly like it says or you will get an error from RunDLL. – Samir – 2013-05-25T17:43:16.393

2This is pretty cool, but unfortunately for automation purposes, it is no better than any of Karan’s suggestions. – Synetech – 2013-12-05T03:28:05.953

4

Since it's a backup device, it means it's a storage device, therefore it can be done from powershell - just replace X: with your desired drive letter:

$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("X:").InvokeVerb("Eject")

Overmind

Posted 2012-06-29T20:01:16.150

Reputation: 8 562

1

I have seen this solution on serverfault as well as on stackoverflow, but I seem to be unable to get it working with my external HDD. There's no error-message, it simly does nothing. Using "F:" or "F:\" didn't make a difference, as did running PowerShell as admin. Safely removing via the Taskbar is working. What am I doing wrong?

– flolilo – 2017-08-21T01:46:41.460

The actual powershell command does not return any error (red text) message ? – Overmind – 2017-08-21T05:55:49.327

If I unplug F:\ and run the command, I get an error that I can't run a method that is NULL (the message is in German, so I'm not completely sure that I got the translation right). If I run the commands with F:\ plugged in, there is no message at all - $error is empty, too. I'm running PowerShell 5.1 on Win10 Pro by the way. F:\ is an external USB HDD that has only one partition (F:) - it can be safely removed via the taskbar without problems. – flolilo – 2017-08-21T10:08:13.850

Interestingly, when I use a USB-pendrive (also with one partition), it works flawlessly. Both have enabled Better performance in their removal policy, though that does not seem to make any difference (USB pendrive works with both settings, USB HDD doesn't). A second pendrive I own also does not like to be ejected via the PowerShell-command. Working: Transcend JetFlash 700 (16GB, FAT32), Not working: Seagate Expansion Portable 2015 (4TB, NTFS), Sandisk Extreme (32GB, exFAT). All tried out multiple times on the same USB-port. Again, safely removing via Taskbar-icon always works. – flolilo – 2017-08-21T12:28:21.730

@flolilolilo i have the same problem... – Ploni – 2017-08-27T12:05:35.350

1

According to this 7tutorials-article, you can enable safe unplugging by setting "Quick removal". This will disable write caching per device, of which the performance impact is "negligible"? Their steps for Windows 7 are below.

(Edit) According to this howtogeek-article, you should still be careful when setting "Quick removal". This will disable write caching, and will thus prevent most problems. But some program(s) may still be writing stuff 'live', until explicitly ejected/removed. (End of edit)

Steps:

  • plug in the device in the USB drive
  • open Device Manager
  • expand Disk Drives
  • right-click your removable drive, e.g. "USB2.0 Flash Disk USB Device."
  • select Properties
  • click the Policies tab
  • enable "Quick removal" (disable "Better performance")

(Edit) Note that you need to use Device Manager to change the setting, it can not be done from the File Explorer. (At least in my Windows 10 edition.)

Yahoo Serious

Posted 2012-06-29T20:01:16.150

Reputation: 196

1This sounds like a great idea for backup drives! It seems this is the default setting though (At least on my Seagate BUP Slim BK USB External Drive). – Arvo Bowen – 2016-04-06T20:57:42.513

1Devices with write-cache enabled are not quick-removable. – Overmind – 2017-08-22T06:21:37.303

1Possible to set this globally so that it applies to any and all USB storage that is attached in the future? – DuckMaestro – 2018-07-12T06:43:00.643

0

Couldn't find an internal command (thanks MS), not a single script out there worked either, removing letter is a poor way to do eject, interactive way is also not cool, and hate to use 3rd party tools. In my case, using something that's on my drive for 20years: the inhouse Microsoft Windows Sysinternals helps the case:

sync -e x:
  • flushes usb drive
  • ejects usb drive
  • keeps letter
  • doesn't distort USB tree

in case of locks, use Sysinternals handle or procexp to find out.

user533385

Posted 2012-06-29T20:01:16.150

Reputation: 11