2008-09-06 30 views
7

Tôi đang cố gắng đề cập đến một ổ đĩa có thư có thể thay đổi. Tôi muốn đề cập đến nó bằng nhãn của nó (ví dụ, MyLabel (v :) trong một tập tin Batch. Nó có thể được tham chiếu bởi V: \. Tôi muốn tham khảo nó bằng MyLabelTham khảo/chọn một ổ đĩa chỉ dựa trên nhãn của nó? (ví dụ: không phải là ký tự ổ đĩa)

(Điều này đã được đăng tải trên chuyên gia Echange cho một tháng không có câu trả lời. Chúng ta hãy xem cách nhanh chóng SO trả lời nó)

Trả lời

1

file bat này sẽ cung cấp cho bạn các ký tự ổ đĩa từ một nhãn ổ đĩa:

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 nó như:

cscript /nologo DriveFromLabel.vbs label 
+1

Bạn có thể gọi tập lệnh .vbs từ tệp .bat không? –

1

Dưới đây là một kịch bản thực thi đơn giản getdrive.cmd để tìm một ký tự ổ đĩa từ một nhãn âm lượng. Chỉ cần gọi "getdrive MyLabel" hoặc 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

Các câu trả lời trước có vẻ quá phức tạp và/hoặc không đặc biệt phù hợp với tệp lô.

Lớp lót đơn giản này sẽ đặt ký tự ổ đĩa mong muốn trong myDrive biến. Rõ ràng là thay đổi "Nhãn của tôi" thành nhãn thực tế của bạn.

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

Nếu chạy từ dòng lệnh (không phải trong tệp lô), thì %% D phải được thay đổi thành% D ở cả hai vị trí.

Khi biến được đặt, bạn có thể tham chiếu đến biến tần bằng cách sử dụng %myDrive%. Ví dụ:

dir %myDrive%\someFolder 
+0

Điều đó chỉ in '%% D bất ngờ tại thời điểm này.' trong' cmd'. – Ajedi32

+1

@ Ajedi32 - Bạn cần đọc kỹ câu trả lời cẩn thận hơn. Bạn phải thay đổi '%% D' thành'% D' nếu chạy trực tiếp từ dòng lệnh (không phải từ bên trong một tập lệnh batch) – dbenham

+0

Rất tiếc, bạn đã đúng. Xin lỗi vì điều đó. Tôi thực sự ngạc nhiên khi biết rằng có các lệnh trong cmd hoạt động khác trong bảng điều khiển so với lệnh trong kịch bản. Oh well, đoán tôi nên chú ý nhiều hơn thời gian tới. – Ajedi32

Các vấn đề liên quan