How do I get a list of drive letters and their associated labels on a windows system through a bat file?
This will get most of it:
If you have any drives mapped via subst you would also need to get those:
For completeness, you would do it like this in Powershell (if you are on windows 7 or have installed it):
gwmi win32_LogicalDisk -filter DriveType=4
You can also do it from the command prompt or a batch file using WMI like this:
wmic logicaldisk get caption,providername,drivetype,volumename
@echo off cls setlocal enabledelayedexpansion set "_DRIVE.LETTERS.FREE=Z Y X W V U T S R Q P O N M L K J I H G F E D C B A " for /f "skip=1 tokens=1,2 delims=: " %%a in ('wmic logicaldisk get deviceid^,volumename') do ( set "_DRIVE.LETTERS.USED=!_DRIVE.LETTERS.USED!%%a,%%b@" set "_DRIVE.LETTERS.FREE=!_DRIVE.LETTERS.FREE:%%a =!" ) set _DRIVE.LETTERS.USED=%_DRIVE.LETTERS.USED:~0,-2% set _DRIVE.LETTERS.USED=%_DRIVE.LETTERS.USED:,@=, @% set _DRIVE.LETTERS
Fast, flexible and efficient. Although a little complex.
If anyone is lucky enough to be using Vista (Vista Ultimate SP2 b6002, in my case) and the gwmi and wmic snippets given here don't work exactly, here is what I did to make it work.
For gwmi, if you receive no output, try changing the DriveType to 3. If still having problems, remove the -filter option altogether and analyze output.
gwmi win32_LogicalDisk -filter DriveType=3
For wmic, if you receive "Invalid GET Expression", then try putting the get expression in quotes:
wmic logicaldisk get "caption,providername,drivetype,volumename"
This site has a much simpler set of calls:
Show local drives:
wmic logicaldisk get deviceid, volumename, description
If you want to show only drives of a particular type, the wmic command can be further expanded to include a where clause.
wmic logicaldisk where drivetype=2 get deviceid, volumename, description
0 => Unknown
1 => No Root Directory
2 => Removable Disk
3 => Local Disk
4 => Network Drive
5 => Compact Disc
6 => RAM Disk
Although it has enough answer, I'd like to add one when you want to use it in batch file. If you get "Invalid GET Expression", you could put a ^ before the ',', like below:
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,providername^,drivetype^,volumename 2^>NUL`) do echo %%i %%l
wmic in a
for loop to determine all the available drives.
@echo off for /f "tokens=2*delims==" %%i in ('wmic logicaldisk get caption /value') do for /f "delims=" %%d in ("%%i") do echo %%d
There is also this little hack using exit codes
90 converted to ascii which will return all Alpabetical characters
Z with all credit to Aacini.
@echo off setlocal enabledelayedexpansion for /L %%i in (65,1,90) do cmd /C exit %%i & if exist "!=ExitCodeAscii!:" echo !=ExitCodeAscii!:
@ECHO OFF IF NOT EXIST A: GOTO B :A VOL A: :B IF NOT EXIST B: GOTO C VOL B: :C IF NOT EXIST C: GOTO D VOL C: :D IF NOT EXIST D: GOTO E VOL D: :E IF NOT EXIST E: GOTO F VOL E: :F IF NOT EXIST F: GOTO G VOL F: :G IF NOT EXIST G: GOTO H VOL G: :H IF NOT EXIST H: GOTO I VOL H: :I IF NOT EXIST I: GOTO J VOL I: :J IF NOT EXIST J: GOTO K VOL J: :K IF NOT EXIST K: GOTO L VOL K: :L IF NOT EXIST L: GOTO M VOL L: :M IF NOT EXIST M: GOTO N VOL M: :N IF NOT EXIST N: GOTO O VOL N: :O IF NOT EXIST O: GOTO P VOL O: :P IF NOT EXIST P: GOTO Q VOL P: :Q IF NOT EXIST Q: GOTO R VOL Q: :R IF NOT EXIST R: GOTO S VOL R: :S IF NOT EXIST S: GOTO T VOL S: :T IF NOT EXIST T: GOTO U VOL T: :U IF NOT EXIST U: GOTO V VOL U: :V IF NOT EXIST V: GOTO W VOL V: :W IF NOT EXIST w: GOTO X VOL W: :X IF NOT EXIST X: GOTO Y VOL X: :Y IF NOT EXIST Y: GOTO Z VOL Y: :Z IF NOT EXIST Z: GOTO END VOL Z: :END