Refer to/select a drive based only on its label? (i.e., not the drive letter)
Asked Answered
T

4

9

I'm trying to refer to a drive whose letter may change. I'd like to refer to it by its label (e.g., MyLabel (v:) within a Batch File. It can be referred to by V:\ . I'd like to refer to it by MyLabel.

(This was posted on Experts Echange for a month with no answer. Let's see how fast SO answers it )

Thine answered 6/9, 2008 at 21:21 Comment(0)
H
1

This bat file will give you the drive letter from a drive label:

Option Explicit
Dim num, args, objWMIService, objItem, colItems

set args = WScript.Arguments
num = args.Count

if num <> 1 then
   WScript.Echo "Usage: CScript DriveFromLabel.vbs <label>"
   WScript.Quit 1
end if

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")

For Each objItem in colItems
  If strcomp(objItem.VolumeName, args.Item(0), 1) = 0 Then
    Wscript.Echo objItem.Name
  End If
Next

WScript.Quit 0

Run it as:

 cscript /nologo DriveFromLabel.vbs label
Hardin answered 6/9, 2008 at 21:49 Comment(1)
Can you call .vbs scripts from .bat files?Thine
P
7

The previous answers seem either overly complicated, and/or not particularly suited to a batch file.

This simple one liner should place the desired drive letter in variable myDrive. Obviously change "My Label" to your actual label.

for /f %%D in ('wmic volume get DriveLetter^, Label ^| find "My Label"') do set myDrive=%%D

If run from the command line (not in a batch file), then %%D must be changed to %D in both places.

Once the variable is set, you can refer to the drive using %myDrive%. For example

dir %myDrive%\someFolder
Privity answered 30/1, 2012 at 15:56 Comment(3)
On another note, it seems this method requires administrator access. Failed to register mof file(s). Only the administrator group members can use WMIC.EXE. Reason:Win32 Error: Access is denied. I guess I'll have to come up with a solution using vol instead.Aekerly
@Aekerly - Are you still on XP? WMIC works without admin privs since Vista.Privity
Unfortunately, yes. Hopefully my company's IT department will finally get around to upgrading one of these days.Aekerly
P
1

You can use the WMI query language for that. Take a look at http://msdn.microsoft.com/en-us/library/aa394592(VS.85).aspx for examples. The information you are looking for is available e.g. through the property VolumeName of the Win32_LogicalDisk class, http://msdn.microsoft.com/en-us/library/aa394173(VS.85).aspx

SELECT * FROM Win32_LogicalDisk WHERE VolumeName="MyLabel"

Payee answered 6/9, 2008 at 21:32 Comment(0)
H
1

This bat file will give you the drive letter from a drive label:

Option Explicit
Dim num, args, objWMIService, objItem, colItems

set args = WScript.Arguments
num = args.Count

if num <> 1 then
   WScript.Echo "Usage: CScript DriveFromLabel.vbs <label>"
   WScript.Quit 1
end if

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")

For Each objItem in colItems
  If strcomp(objItem.VolumeName, args.Item(0), 1) = 0 Then
    Wscript.Echo objItem.Name
  End If
Next

WScript.Quit 0

Run it as:

 cscript /nologo DriveFromLabel.vbs label
Hardin answered 6/9, 2008 at 21:49 Comment(1)
Can you call .vbs scripts from .bat files?Thine
P
1

Here is a simple batch script getdrive.cmd to find a drive letter from a volume label. Just call "getdrive MyLabel" or getdrive "My Label".

@echo off
setlocal

:: Initial variables
set TMPFILE=%~dp0getdrive.tmp
set driveletters=abcdefghijklmnopqrstuvwxyz
set MatchLabel_res=

for /L %%g in (2,1,25) do call :MatchLabel %%g %*

if not "%MatchLabel_res%"=="" echo %MatchLabel_res%

goto :END


:: Function to match a label with a drive letter. 
::
:: The first parameter is an integer from 1..26 that needs to be 
:: converted in a letter. It is easier looping on a number
:: than looping on letters.
::
:: The second parameter is the volume name passed-on to the script
:MatchLabel

:: result already found, just do nothing 
:: (necessary because there is no break for for loops)
if not "%MatchLabel_res%"=="" goto :eof

:: get the proper drive letter
call set dl=%%driveletters:~%1,1%%

:: strip-off the " in the volume name to be able to add them again further
set volname=%2
set volname=%volname:"=%

:: get the volume information on that disk
vol %dl%: > "%TMPFILE%" 2>&1

:: Drive/Volume does not exist, just quit
if not "%ERRORLEVEL%"=="0" goto :eof

set found=0
for /F "usebackq tokens=3 delims=:" %%g in (`find /C /I "%volname%" "%TMPFILE%"`) do set found=%%g

:: trick to stip any whitespaces
set /A found=%found% + 0


if not "%found%"=="0" set MatchLabel_res=%dl%:
goto :eof








:END

if exist "%TMPFILE%" del "%TMPFILE%"
endlocal
Proportionable answered 16/9, 2008 at 5:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.