仅根据标签参考/选择驱动器? (即不是驱动器号)

时间:2008-09-06 21:21:11

标签: windows batch-file

我正在尝试提及一封信可能会改变的驱动器。我想通过它的标签来引用它(例如,批处理文件中的MyLabel(v :)。它可以被V:\引用。我想通过MyLabel引用它。

(这已发布在Expert Echange上一个月没有回答。让我们看看SO的答案有多快)

4 个答案:

答案 0 :(得分:7)

以前的答案似乎过于复杂,和/或不太适合批处理文件。

这个简单的衬垫应该将所需的驱动器号放在变量myDrive中。显然,将“我的标签”更改为您的实际标签。

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

如果从命令行运行(不在批处理文件中),则必须在两个地方将%% D更改为%D.

设置变量后,您可以使用%myDrive%来引用该驱动器。例如

dir %myDrive%\someFolder

答案 1 :(得分:1)

您可以使用WMI查询语言。 请查看http://msdn.microsoft.com/en-us/library/aa394592(VS.85).aspx的示例。 您正在寻找的信息可用,例如通过Win32_LogicalDisk类的属性VolumeName,http://msdn.microsoft.com/en-us/library/aa394173(VS.85).aspx

SELECT * FROM Win32_LogicalDisk WHERE VolumeName="MyLabel"

答案 2 :(得分:1)

此bat文件将为您提供驱动器标签的驱动器号:

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

将其运行为:

 cscript /nologo DriveFromLabel.vbs label

答案 3 :(得分:1)

这是一个简单的批处理脚本getdrive.cmd,用于查找卷标的驱动器号。只需拨打“getdrive MyLabel”或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