windows - run - Consulte/seleccione una unidad basada solo en su etiqueta?(es decir, no la letra de la unidad)
windows batch file virus (4)
Este archivo de bat le dará la letra de la unidad de una etiqueta de 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
Ejecútelo como:
cscript /nologo DriveFromLabel.vbs label
Intento referirme a un disco cuya letra puede cambiar. Me gustaría referirme a él por su etiqueta (por ejemplo, MyLabel (v :) dentro de un archivo por lotes. Puede ser referido por V: /. Me gustaría referirme a él por MyLabel.
(Esto fue publicado en Experts Echange por un mes sin respuesta. Veamos qué tan rápido lo responde)
Puede usar el lenguaje de consulta WMI para eso. Eche un vistazo a http://msdn.microsoft.com/en-us/library/aa394592(VS.85).aspx para ver ejemplos. La información que está buscando está disponible, por ejemplo, a través de la propiedad VolumeName de la clase Win32_LogicalDisk, http://msdn.microsoft.com/en-us/library/aa394173(VS.85).aspx
SELECT * FROM Win32_LogicalDisk WHERE VolumeName="MyLabel"
Aquí hay una secuencia de comandos por lotes simple getdrive.cmd para encontrar una letra de unidad de 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
Las respuestas anteriores parecen demasiado complicadas o no son especialmente adecuadas para un archivo por lotes.
Este sencillo trazador de líneas 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 cambiarse a% D en ambos lugares.
Una vez que se establece la variable, puede consultar el disco utilizando %myDrive%
. Por ejemplo
dir %myDrive%/someFolder