2008-09-06 16 views
7

Estoy intentando hacer referencia a un disco cuya letra puede cambiar. Me gustaría referirme a ella por su etiqueta (por ejemplo, MyLabel (v :) dentro de un archivo por lotes. Puede referirse a ella por medio de V: \. Me gustaría referirme a ella por MyLabel.Consulte/seleccione una unidad basada solo en su etiqueta? (es decir, no la letra de la unidad)

(este fue publicada el Expertos Echange durante un mes sin respuesta. Vamos a ver qué tan rápido responde por lo que)

Respuesta

1

Este archivo bat le dará la letra de unidad de una etiqueta de la unidad:

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 

Ejecutar como:

cscript /nologo DriveFromLabel.vbs label 
+1

¿Puede usted llamar a los scripts .vbs desde archivos .bat? –

1

Aquí es una secuencia de comandos por lotes sencillo getdrive.cmd para encontrar una letra de unidad una etiqueta de volumen. Simplemente llame a "getdrive MyLabel" o acceda a "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 
7

Las respuestas anteriores parecen demasiado complicadas o no son especialmente adecuadas para un archivo por lotes.

Este simple liner debe colocar la letra de unidad deseada en la variable myDrive. Obviamente cambie "Mi etiqueta" a su etiqueta actual.

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

si se ejecuta desde la línea de comandos (no en un archivo por lotes), entonces %% D debe ser cambiado a% D en ambos lugares.

Una vez que se establece la variable, puede consultar la unidad usando %myDrive%. Por ejemplo

dir %myDrive%\someFolder 
+0

Eso solo imprime '%% D inesperado en este momento' en' cmd'. – Ajedi32

+1

@ Ajedi32 - Debe leer la respuesta con más cuidado. Debe cambiar '%% D' a'% D' si se ejecuta directamente desde la línea de comandos (no desde un script por lotes) – dbenham

+0

Vaya, tiene razón. Lo siento por eso. Estoy realmente sorprendido de escuchar que hay comandos en cmd que funcionan de manera diferente en la consola que en un script. Bueno, supongo que debería prestar más atención la próxima vez. – Ajedi32

Cuestiones relacionadas