Làm thế nào để có được danh sách các ký tự ổ đĩa trên hệ thống thông qua shell windows (bat, cmd)?


Câu trả lời:


36

Điều này sẽ nhận được hầu hết của nó:

Net Use

Nếu bạn có bất kỳ ổ đĩa nào được ánh xạ qua trạm biến áp, bạn cũng cần có được những ổ đĩa đó:

Subst

Để hoàn thiện, bạn sẽ làm như thế này trong Powershell (nếu bạn đang ở trên windows 7 hoặc đã cài đặt nó):

gwmi win32_LogicalDisk -filter DriveType=4

Bạn cũng có thể làm điều đó từ dấu nhắc lệnh hoặc tệp bó bằng WMI như thế này:

wmic logicaldisk get caption,providername,drivetype,volumename

1
Điều này không liệt kê các ổ đĩa cục bộ như bất kỳ ổ đĩa cứng hoặc cdrom nội bộ nào. Tui bỏ lỡ điều gì vậy?
Chris Magnuson

Không, tôi hiểu nhầm câu hỏi. Tôi nghĩ rằng bạn chỉ muốn các ổ đĩa được ánh xạ. Tôi sẽ chỉnh sửa.
EBGreen

2
Các giải pháp vũ trụ sẽ cung cấp cho bạn tất cả mọi thứ.
EBGreen

Bạn cần xóa các trích dẫn khỏi wd logicdisk nhận "chú thích, tên người dùng, drivetype" để nó là logicdisk nhận được chú thích, tên người dùng, thông minh khác, nó sẽ gây ra lỗi. EBGreen bạn đã một mình thổi bay tâm trí của tôi trong ngày, tôi chưa bao giờ thấy wmic mặc dù tôi đã viết kịch bản xây dựng máy chủ khác nhau trong nhiều tuần và tôi cực kỳ phấn khích để xem những gì tôi có thể làm với nó. Lam tôt lăm!
Chris Magnuson

1
wmic logicdisk nhận chú thích, tên người dùng, drivetype, volumame VolumeName là những gì tôi đã thiếu, nếu bạn cập nhật tên của bạn với điều đó tôi sẽ chấp nhận nó như là câu trả lời. Cảm ơn
Chris Magnuson

15

Để sử dụng đĩa, không cần tạo tệp trung gian. Thử:

echo list volume | diskpart

2
Đây là câu trả lời tốt nhất và trả về nhiều thông tin nhất về các ổ đĩa được gắn ở định dạng đẹp.
ekerner

nhưng nó đòi hỏi quyền quản trị
LogicDaemon

9
@echo off
cls
setlocal enabledelayedexpansion
set "_DRIVE.LETTERS.FREE=Z Y X W V U T S R Q P O N M L K J I H G F E D C B A "
for /f "skip=1 tokens=1,2 delims=: " %%a in ('wmic logicaldisk get deviceid^,volumename') do (
   set "_DRIVE.LETTERS.USED=!_DRIVE.LETTERS.USED!%%a,%%b@"
   set "_DRIVE.LETTERS.FREE=!_DRIVE.LETTERS.FREE:%%a =!"
)
set _DRIVE.LETTERS.USED=%_DRIVE.LETTERS.USED:~0,-2%
set _DRIVE.LETTERS.USED=%_DRIVE.LETTERS.USED:,@=, @%
set _DRIVE.LETTERS

Nhanh chóng, linh hoạt và hiệu quả. Mặc dù hơi phức tạp.


Tôi không biết phiên bản Windows này hoạt động trên cái gì nhưng tôi chỉ thử nghiệm nó trên các máy Win 7 và XP của mình và nhận được kết quả sau từ cả hai: `DRIVE LETTER (s): USED:" = "DRIVE LETTER (s): MIỄN PHÍ: "! TMP_FREE_DRIVE_LETTERS!" `
John Gardeniers

Xin lỗi, bạn cần đặt cái này vào đầu tập tin bó. setlocal enableelayed mở rộng
Dharma Leonardi

Tôi đã chỉnh sửa câu trả lời của bạn để bao gồm dòng còn thiếu. Nó hoạt dộng bây giờ. +1
John Gardeniers

7

lấy cảm hứng từ Scott

for %i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do @%i: 2>nul && set/pz=%i <nul

cũng hiển thị ký tự ổ đĩa CD. không cần phải là admin.


đơn giản và hiệu quả
Tyler Long

"tôi đã bất ngờ vào lúc này."
Berit Larsen

@BeritLarsen bạn cần tăng gấp đôi% ký hiệu nếu chạy nó dưới dạng tệp bó chứ không phải trên dòng lệnh.
TessellatingHeckler

5
mountvol

đầu ra mẫu

\\?\Volume{11197e59-f977-11dd-afc6-111e6f6e6963}\
   *** NO MOUNTING POINT ***

\\?\Volume{11197e59-f977-11dd-afc6-111e6f6e6963}\
   D:\

\\?\Volume{11197e59-f977-11dd-afc6-111e6f6e6963}\
   C:\

\\?\Volume{11197e59-f977-11dd-afc6-111e6f6e6963}\
   E:\

4

Nếu bất cứ ai đủ may mắn để sử dụng Vista (trong trường hợp của tôi là Vista Ultimate SP2 b6002) và các đoạn gwmiwmic được đưa ra ở đây không hoạt động chính xác, đây là những gì tôi đã làm để làm cho nó hoạt động.

Đối với gwmi , nếu bạn không nhận được đầu ra, hãy thử thay đổi DriveType thành 3. Nếu vẫn gặp sự cố, hãy loại bỏ hoàn toàn tùy chọn -filter và phân tích đầu ra.

gwmi win32_LogicalDisk -filter DriveType=3

Đối với wmic , nếu bạn nhận được "Biểu thức GET không hợp lệ", thì hãy thử đặt biểu thức get trong dấu ngoặc kép:

wmic logicaldisk get "caption,providername,drivetype,volumename"

2

Trang web này có một bộ các cuộc gọi đơn giản hơn nhiều:

http://en.code-bude.net/2013/02/23/show-all-drive-in-command-prompt/

Hiển thị ổ đĩa cục bộ:

wd logicdisk nhận thiết bị, volumame, mô tả


Nếu bạn muốn chỉ hiển thị các ổ đĩa của một loại cụ thể, lệnh wmic có thể được mở rộng hơn nữa để bao gồm một mệnh đề where.

wmic logicdisk trong đó drivetype = 2 lấy deviceid, volumame, mô tả

Các loại

0 => Không biết

1 => Không có thư mục gốc

2 => Đĩa di động

3 => Đĩa cục bộ

4 => Ổ đĩa mạng

5 => Đĩa compact

6 => Đĩa RAM


2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause

Tôi đã thử cái này và nó không hoạt động. Tôi nghĩ rằng cần phải có một khoảng trống ở phía trước / nhưng ngay cả với sự thay đổi đó, nó vẫn không hoạt động. Tôi đặt phần trên vào một tệp, d.bat và tôi thấy cửa sổ Diskpart bật lên nhưng sau đó biến mất và vỏ cmd nơi tôi đang chạy này sau đó hiển thị tạm dừng chạy.
slm

1
for %a in (c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z:) do @vol %a 2>&1 | find "drive"

Tôi thấy cách tiếp cận của phần mềm báo cáo ổ đĩa DVD không có đĩa được chèn và không báo cáo thẻ SD có dung lượng ổ đĩa hợp lệ


không hoạt động cho windows xp
Tyler Long

1
for %%p in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%p:\nul your_command_and_parameters_here

0

Hơi bẩn, nhưng hoạt động từ một tệp bó:

echo LIST VOLUME > temp.txt && diskpart /s temp.txt && del /q temp.txt

0

Mặc dù nó có đủ câu trả lời, tôi muốn thêm một câu khi bạn muốn sử dụng nó trong tệp bó. Nếu bạn nhận được "Biểu thức GET không hợp lệ", bạn có thể đặt ^ trước dấu ',', như bên dưới:

for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,providername^,drivetype^,volumename 2^>NUL`) do echo %%i %%l

Cái này ^làm gì ở đây?
vonbrand

Đây là ký tự thoát của cmd.exe, tương tự như \ trong Unix như shell.
gimpf

-1
@ECHO OFF
IF NOT EXIST A: GOTO B
:A
VOL A:
:B
IF NOT EXIST B: GOTO C
VOL B:
:C
IF NOT EXIST C: GOTO D
VOL C:
:D
IF NOT EXIST D: GOTO E
VOL D:
:E
IF NOT EXIST E: GOTO F
VOL E:
:F
IF NOT EXIST F: GOTO G
VOL F:
:G
IF NOT EXIST G: GOTO H
VOL G:
:H
IF NOT EXIST H: GOTO I
VOL H:
:I
IF NOT EXIST I: GOTO J
VOL I:
:J
IF NOT EXIST J: GOTO K
VOL J:
:K
IF NOT EXIST K: GOTO L
VOL K:
:L
IF NOT EXIST L: GOTO M
VOL L:
:M
IF NOT EXIST M: GOTO N
VOL M:
:N
IF NOT EXIST N: GOTO O
VOL N:
:O
IF NOT EXIST O: GOTO P
VOL O:
:P
IF NOT EXIST P: GOTO Q
VOL P:
:Q
IF NOT EXIST Q: GOTO R
VOL Q:
:R
IF NOT EXIST R: GOTO S
VOL R:
:S
IF NOT EXIST S: GOTO T
VOL S:
:T
IF NOT EXIST T: GOTO U
VOL T:
:U
IF NOT EXIST U: GOTO V
VOL U:
:V
IF NOT EXIST V: GOTO W
VOL V:
:W
IF NOT EXIST w: GOTO X
VOL W:
:X
IF NOT EXIST X: GOTO Y
VOL X:
:Y
IF NOT EXIST Y: GOTO Z
VOL Y:
:Z
IF NOT EXIST Z: GOTO END
VOL Z:
:END

Ừm, wow. Vì vậy, nếu bạn có thể chắt lọc nó vào một cái gì đó thực sự sẽ chỉ xuất ra các ký tự ổ đĩa và nhãn tồn tại trên hệ thống sẽ gần với câu trả lời hơn cho câu hỏi mặc dù đây là chuyển động ít nhất theo đúng hướng.
Chris Magnuson

Tôi đang bị bỏ phiếu vì đã cung cấp giải pháp đáp ứng các tiêu chí? Wow ...
Scott

4
Vâng, đối với một điều, nó tạo ra lỗi cho các ổ đĩa tồn tại nhưng không chứa phương tiện truyền thông, chẳng hạn như ổ đĩa CD / DVD.
Tạm dừng cho đến khi có thông báo mới.

+1 cho ý tưởng
Tyler Long

tất cả mưa đá mã Trung Quốc!
LogicDaemon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.