2008-09-06 8 views
7

J'essaie de me référer à un lecteur dont la lettre peut changer. Je voudrais me référer à lui par son étiquette (par exemple, MyLabel (v :) dans un fichier de commandes.Il peut être référé par V: \ .Je voudrais y faire référence par MyLabelVous référez/sélectionnez un lecteur basé seulement sur son étiquette? (c'est-à-dire, pas la lettre de lecteur)

(Cela a été posté sur 'Echange pour un mois sans réponse. Voyons voir à quelle vitesse répond SO il)

Répondre

1

Ce fichier de chauve-souris vous donnera la lettre de lecteur à partir d'une étiquette de disque:

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 

Exécuter comme:

cscript /nologo DriveFromLabel.vbs label 
+1

Pouvez-vous appeler des scripts .vbs de fichiers .bat? –

1

Voici un script simple lot getdrive.cmd pour trouver une lettre de lecteur de une étiquette de volume. Appelez simplement "getdrive MyLabel" ou 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 
7

Les réponses précédentes semblent trop compliquées et/ou ne sont pas particulièrement adaptées à un fichier batch.

Cette simple doublure doit placer la lettre de lecteur souhaitée dans la variable myDrive. Évidemment, changez "My Label" pour votre étiquette actuelle.

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

Si exécuté à partir de la ligne de commande (pas dans un fichier batch), puis %% D doit être changé en% D dans les deux endroits.

Une fois la variable définie, vous pouvez vous référer au lecteur à l'aide de %myDrive%. Par exemple

dir %myDrive%\someFolder 
+0

Cela affiche simplement '%% D était inattendu à ce moment-là.' Dans 'cmd'. – Ajedi32

+1

@ Ajedi32 - Vous devez lire la réponse plus attentivement. Vous devez changer '%% D' en'% D' si vous exécutez directement depuis la ligne de commande (pas depuis un script batch) – dbenham

+0

Oups, vous avez raison. Désolé pour ça. Je suis vraiment surpris d'entendre qu'il y a des commandes dans cmd qui fonctionnent différemment dans la console que dans un script. Eh bien, je suppose que je devrais faire plus attention la prochaine fois. – Ajedi32

Questions connexes