Jak uzyskać listę liter dysków w systemie za pomocą powłoki systemu Windows (bat, cmd)?

Odpowiedzi:

36

To pozwoli uzyskać większość:

Net Use

Jeśli masz jakieś dyski zmapowane przez podstację, musisz je również uzyskać:

Subst

Dla kompletności, zrobiłbyś to w Powershell (jeśli korzystasz z Windows 7 lub zainstalowałeś go):

gwmi win32_LogicalDisk -filter DriveType=4

Możesz to również zrobić z wiersza polecenia lub pliku wsadowego, używając WMI w następujący sposób:

wmic logicaldisk get caption,providername,drivetype,volumename
EBGreen
źródło
1
Nie zawiera lokalnych napędów dyskowych, takich jak wewnętrzne dyski twarde lub cdromy. Czy coś brakuje?
Chris Magnuson
Nie, źle zrozumiałem pytanie. Myślałem, że chcesz tylko zamapowanych dysków. Będę edytować.
EBGreen,
2
Rozwiązanie WMIC powinno dać ci wszystko.
EBGreen,
Musisz usunąć cudzysłowy z wmic logicaldisk get „caption, providerername, driveetype”, aby był to wmic logicaldisk get caption, Provernername, typ napędu, w przeciwnym razie zgłasza błąd. EBGreen, którego od razu rzuciłeś mi do głowy na cały dzień, nigdy nie widziałem wmic, mimo że od tygodni piszę różne wersje serwerów i jestem bardzo podekscytowany, widząc, co jeszcze mogę z tym zrobić. Dobra robota!
Chris Magnuson
1
wmic logicaldisk get caption, nazwa dostawcy, typ napędu, volumename nazwa VolumeName była tym, czego mi brakowało, jeśli zaktualizujesz ją, zaakceptuję ją jako odpowiedź. Dzięki
Chris Magnuson,
15

Aby użyć diskpart, nie trzeba tworzyć pliku pośredniego. Próbować:

echo list volume | diskpart
gnoise
źródło
2
To najlepsza odpowiedź i zwraca najwięcej informacji o zamontowanych dyskach w pięknym formacie.
ekerner
ale wymaga uprawnień administratora
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

Szybki, elastyczny i wydajny. Chociaż trochę skomplikowane.

Dharma Leonardi
źródło
Nie wiem, na jakich wersjach systemu Windows to działa, ale właśnie przetestowałem go na moich systemach Windows 7 i XP i otrzymałem następujące dane wyjściowe z obu: `DRET LIST: USED:" = "DRIVE LIST: DARMOWE: „! TMP_FREE_DRIVE_LETTERS!” ”
John Gardeniers
Przepraszamy, musisz to umieścić na początku pliku wsadowego. setlocal włączony opóźniony rozwój
Dharma Leonardi
Zmodyfikowałem twoją odpowiedź, aby uwzględnić brakującą linię. Teraz działa. +1
John Gardeniers
7

zainspirowany 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

pokazuje również literę napędu CD. nie trzeba być administratorem.

Yuning
źródło
proste i działa
Tyler Long
„W tym czasie byłem nieoczekiwany”.
Berit Larsen,
@BeritLarsen musisz podwoić% symboli, jeśli uruchamiasz go jako plik wsadowy, a nie w wierszu poleceń.
TessellatingHeckler
5
mountvol

próbka wyjściowa

\\?\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:\
Jader Dias
źródło
4

Jeśli ktoś ma szczęście korzystać z Visty (w moim przypadku Vista Ultimate SP2 b6002), a podane tutaj fragmenty gwmi i wmic nie działają dokładnie, oto, co zrobiłem, aby działało.

W przypadku gwmi , jeśli nie otrzymasz danych wyjściowych, spróbuj zmienić DriveType na 3. Jeśli nadal masz problemy, całkowicie usuń opcję -filter i przeanalizuj dane wyjściowe.

gwmi win32_LogicalDisk -filter DriveType=3

W przypadku wmic , jeśli pojawi się „Nieprawidłowe wyrażenie GET”, spróbuj umieścić wyrażenie get w cudzysłowach:

wmic logicaldisk get "caption,providername,drivetype,volumename"
tdowg1
źródło
2

Ta strona ma znacznie prostszy zestaw połączeń:

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

Pokaż dyski lokalne:

wmic logicaldisk get deviceid, volumename, description


Jeśli chcesz wyświetlać tylko dyski określonego typu, komendę wmic można dodatkowo rozszerzyć o klauzulę where.

wmic logicaldisk gdzie driveetype = 2 get deviceid, volumename, description

Rodzaje

0 => Nieznany

1 => Brak katalogu głównego

2 => Dysk wymienny

3 => Dysk lokalny

4 => Dysk sieciowy

5 => Płyta kompaktowa

6 => Dysk RAM

David Tr
źródło
2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause
5d4gd
źródło
Próbowałem tego i nie zadziałało. Myślę, że przed / s musi być spacja, ale nawet przy tej zmianie nie zadziałało. Umieszczam powyższe w pliku, d.bat i widzę, że okno diskpart miga, ale potem znika, a powłoka cmd, w której działam, pokazuje następnie uruchomioną pauzę.
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"

Odkryłem, że podejście diskpart zgłasza napędy DVD bez włożonej płyty i nie zgłasza kart SD z prawidłowymi woluminami napędu

Nacięcie
źródło
nie działa w systemie 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
pbies
źródło
0

Nieco niewyraźne, ale działa z pliku wsadowego:

echo LIST VOLUME > temp.txt && diskpart /s temp.txt && del /q temp.txt
Ogniwo
źródło
0

Chociaż ma wystarczającą odpowiedź, chciałbym ją dodać, jeśli chcesz użyć jej w pliku wsadowym. Jeśli pojawi się „Nieprawidłowe wyrażenie GET”, możesz wstawić ^ przed „,”, jak poniżej:

for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,providername^,drivetype^,volumename 2^>NUL`) do echo %%i %%l
Mingjiang Shi
źródło
Co to ^tutaj robi?
vonbrand
Jest to znak ucieczki cmd.exe, podobny do \ w Uniksie jak powłoki.
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
Scott
źródło
Wow. Jeśli więc możesz go destylować na coś, co w rzeczywistości po prostu wyprowadziłoby litery napędu i etykiety istniejące w systemie, które byłyby bliższe odpowiedzi na pytanie, chociaż jest to najmniej ruch we właściwym kierunku.
Chris Magnuson
Czy jestem głosowany za dostarczenie rozwiązania spełniającego kryteria? Wow ...
Scott,
4
Po pierwsze, generuje błędy dla napędów, które istnieją, ale nie zawierają nośników, takich jak napęd CD / DVD.
Wstrzymano do odwołania.
+1 za pomysł
Tyler Long
niech żyje chiński kod!
LogicDaemon