I'm automating the removal of a USB printer from machines with Windows XP SP3. To do this, I'm using Microsoft's Devcon Utility.
Running the command:
devcon findall *hp*
Returns:
USBPRINT\HEWLETT-PACKARDHP_LASERJET_PROFESSIONAL_P1606DN\7&8885729&0&USB001: HP
LaserJet Professional P1606dn
1 matching device(s) found.
Running the command:
devcon remove *USBPRINT*
Returns:
No devices removed.
I've tried multiple combinations of the Hardware ID and wildcards with no luck. Plugging the device in to the computer and running the remove command mentioned above removes the hardware.
The issue comes from me using devcon piped to find to determine if the device is plugged in so that it can be automatically configured. If I can't remove it, it will be detected by my script even if it isn't plugged in.
I've tested this with multiple USB printers and one USB mouse, all exhibit the same behavior, which leads me to believe this is normal behavior for Devcon.
Is there a workaround? How do I remove hardware entries that are no longer connected?
Devcon does work. You just need to make sure you are targeting the right version of devcon for your operation system.
Take a look at this link http://freneticrapport.blogspot.com/2011/05/windows-hiddennot-connected-device.html.
For installing the correct devcon version for your OS:
build -ceZ
You can then remove the device with the following command:
Take note of the quotes and @ symbol as these are required to allow hidden devices to be removed.
Devcon cannot remove hardware that isn't currently connected. This is intended behavior. I should have read the documentation better.
The
findall
command searches for ALL hardware, connected or not. I should have been using thefind
command, which only searches for currently connected hardware.devon can and will remove non present hardware as GregL mentioned.
The string must be formated correctly.
The following batch file will match all devices based on the input string and remove them:
A removeall command has been added to devcon. devcon is part of the Windows Driver Kit (WDK), but I did not find the new removeall command in the executables that come in the WDK. I assume you must build it from the source code; that is what I did. Instructions are here: Building devcon from source
It involves installing Visual Studio, Windows SDK, WDK, then downloading the latest samples from the git repository. I found that I needed to execute "MC msgs.mc" by hand to make the build work.