Как получить список букв дисков в системе через оболочку Windows (bat, cmd)?

Ответы:

36

Это получит большую часть этого:

Net Use

Если у вас есть какие-либо диски, подключенные через subst, вам также необходимо получить их:

Subst

Для полноты вы должны сделать это в Powershell (если вы используете Windows 7 или установили его):

gwmi win32_LogicalDisk -filter DriveType=4

Вы также можете сделать это из командной строки или командного файла с помощью WMI следующим образом:

wmic logicaldisk get caption,providername,drivetype,volumename
EBGreen
источник
1
Это не список локальных дисков, как любые внутренние жесткие диски или компакт-диски. Я что-то пропустил?
Крис Магнусон
Нет, я неправильно понял вопрос. Я думал, что вы хотели только подключенные диски. Я буду редактировать.
EBGreen
2
Решение wmic должно дать вам все.
EBGreen
Вам нужно удалить кавычки из wmic логического диска get "caption, имя поставщика, тип диска", чтобы он был wmic логический диск получить заголовок, имя провайдера, тип диска, иначе он выдает ошибку. EBGreen, вы в одиночку взорвали мне голову на весь день, я никогда не видел wmic, хотя я несколько недель писал сценарии для различных сборок серверов, и я очень рад узнать, что еще я могу с ним сделать. Отличная работа!
Крис Магнусон
1
Wmic LogicalDisk получить заголовок, имя провайдера, тип диска, имя тома, имя тома, который я пропустил, если вы обновите свой с этим, я приму его в качестве ответа. Спасибо
Крис Магнусон
15

Чтобы использовать diskpart, нет необходимости создавать промежуточный файл. Пытаться:

echo list volume | diskpart
gnoise
источник
2
Это лучший ответ и возвращает большую информацию о подключенных дисках в прекрасном формате.
ekerner
но это требует прав администратора
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

Быстро, гибко и эффективно. Хотя немного сложнее.

Дхарма Леонарди
источник
Я не знаю, на каких версиях Windows это работает, но я только что проверил это на своих машинах с Win 7 и XP и получил следующие выходные данные: `DRIVE LETTER (s): USED:" = "DRIVE LETTER (s): БЕСПЛАТНО: "! TMP_FREE_DRIVE_LETTERS!" `
Джон Гарденье
Извините, вам нужно поместить это в начало командного файла. setlocal enabledelayedexpansion
Дхарма Леонарди
Я отредактировал ваш ответ, добавив пропущенную строку. Это работает сейчас. +1
Джон Гарденье
7

вдохновленный Скоттом

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

также показывает букву компакт-диска. не нужно быть администратором.

Yuning
источник
просто и работает
Тайлер Лонг
«Я был неожиданным в это время».
Берит Ларсен
@BeritLarsen вам нужно удвоить символы%, если вы запускаете их как командный файл, а не в командной строке.
TessellatingHeckler
5
mountvol

образец вывода

\\?\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

Если кому-то посчастливится использовать Vista (Vista Ultimate SP2 b6002, в моем случае) и gwmi и приведенные здесь фрагменты wmic не работают точно, вот что я сделал, чтобы это работало.

Для gwmi , если вы не получаете вывод, попробуйте изменить DriveType на 3. Если все еще возникают проблемы, вообще удалите опцию -filter и проанализируйте вывод.

gwmi win32_LogicalDisk -filter DriveType=3

Для wmic , если вы получили «Invalid GET Expression», попробуйте поместить выражение get в кавычки:

wmic logicaldisk get "caption,providername,drivetype,volumename"
tdowg1
источник
2

Этот сайт имеет гораздо более простой набор звонков:

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

Показать локальные диски:

wmic logicdisk get deviceid, имя, описание


Если вы хотите показать только диски определенного типа, команда wmic может быть дополнительно расширена, чтобы включить предложение where.

Wmic LogicalDisk, где drivetype = 2 получить идентификатор устройства, имя, описание

Типы

0 => Неизвестно

1 => Нет корневого каталога

2 => Съемный диск

3 => Локальный диск

4 => Сетевой диск

5 => Компакт-диск

6 => RAM диск

Дэвид Тр
источник
2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause
5d4gd
источник
Я попробовал это, и это не сработало. Я думаю, что перед / с должно быть место, но даже с этим изменением это не сработало. Я помещаю вышеупомянутое в файл, d.bat, и я вижу, что окно diskpart вспыхивает, но затем исчезает, и оболочка cmd, где я запускаю это, затем показывает запущенную паузу.
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"

Я обнаружил, что подход diskpart сообщает о дисководах DVD без вставленного диска и не сообщает о картах SD с действительными томами дисков

Ник
источник
не работает для Windows XP
Тайлер Лонг
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
источник
0

Немного клудый, но работает из командного файла:

echo LIST VOLUME > temp.txt && diskpart /s temp.txt && del /q temp.txt
нексус
источник
0

Хотя ответа достаточно, я бы хотел добавить его, когда вы захотите использовать его в командном файле. Если вы получили «Неверное выражение GET», вы можете поставить ^ перед «,», как показано ниже:

for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,providername^,drivetype^,volumename 2^>NUL`) do echo %%i %%l
Минцзян Ши
источник
Что это ^делает здесь?
vonbrand
Это управляющий символ cmd.exe, похожий на \ в Unix как оболочки.
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
Скотт
источник
Ого Так что, если вы можете перевести это в нечто, что на самом деле просто выведет буквы дисков и метки, которые существуют в системе, это будет ближе к ответу на вопрос, хотя это наименьшее движение в правильном направлении.
Крис Магнусон
Мне отказывают в предоставлении решения, которое соответствует критериям? Вау ...
Скотт
4
Ну, во-первых, он выдает ошибки для приводов, которые существуют, но не содержат носителей, таких как привод CD / DVD.
Приостановлено до дальнейшего уведомления.
+1 за идею
Тайлер Лонг
все приветствуют китайский код!
LogicDaemon