¿Cómo obtener una lista de letras de unidad en un sistema a través de un shell de Windows (bat, cmd)?

Respuestas:

36

Esto obtendrá la mayor parte:

Net Use

Si tiene alguna unidad asignada a través de subst, también necesitaría obtenerla:

Subst

Para completar, lo haría así en Powershell (si está en Windows 7 o lo ha instalado):

gwmi win32_LogicalDisk -filter DriveType=4

También puede hacerlo desde el símbolo del sistema o un archivo por lotes utilizando WMI de esta manera:

wmic logicaldisk get caption,providername,drivetype,volumename
EBGreen
fuente
1
Esto no enumera las unidades de disco locales como cualquier disco duro interno o CDROM. ¿Me estoy perdiendo de algo?
Chris Magnuson el
No, entendí mal la pregunta. Pensé que solo querías unidades mapeadas. Voy a editar
EBGreen
2
La solución wmic debería darte todo.
EBGreen
Debe eliminar las comillas de wmic logicaldisk get "caption, providername, drivetype" para que sea wmic logicaldisk get caption, providername, drivetype, de lo contrario arroja un error. EBGreen me ha dejado sin aliento por el día, nunca he visto wmic a pesar de que he estado escribiendo varias compilaciones de servidores durante semanas y estoy extremadamente emocionado de ver qué más puedo hacer con él. ¡Gran trabajo!
Chris Magnuson el
1
wmic logicaldisk get caption, providername, drivetype, volumename the VolumeName era lo que me faltaba, si actualiza el suyo con eso, lo aceptaré como respuesta. Gracias
Chris Magnuson
15

Para usar diskpart, no es necesario crear un archivo intermedio. Tratar:

echo list volume | diskpart
gnoise
fuente
2
Esta es la mejor respuesta y devuelve la mayor información sobre las unidades montadas en un formato hermoso.
ekerner
pero requiere derechos de administrador
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

Rápido, flexible y eficiente. Aunque un poco complejo.

Dharma Leonardi
fuente
No sé en qué versiones de Windows funciona, pero acabo de probarlo en mis máquinas Win 7 y XP y obtuve el siguiente resultado de ambos: `LETRAS DE CONDUCCIÓN: USADAS:" = "LETRAS DE CONDUCCIÓN: GRATIS: "! TMP_FREE_DRIVE_LETTERS!" `
John Gardeniers
Lo sentimos, debes poner esto al comienzo del archivo por lotes. setlocal enabledelayedexpansion
Dharma Leonardi
He editado tu respuesta para incluir la línea que falta. Ahora funciona. +1
John Gardeniers
7

inspirado en 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

también muestra la letra de la unidad de CD. No es necesario ser administrador.

Yuning
fuente
simple y funciona
Tyler Long
"Fui inesperado en este momento".
Berit Larsen
@BeritLarsen necesita duplicar% símbolos si lo ejecuta como un archivo por lotes en lugar de en la línea de comandos.
TessellatingHeckler
5
mountvol

salida de muestra

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

Si alguien tiene la suerte de estar usando Vista (Vista Ultimate SP2 b6002, en mi caso) y los fragmentos gwmi y wmic que se proporcionan aquí no funcionan exactamente, esto es lo que hice para que funcione.

Para gwmi , si no recibe salida, intente cambiar el DriveType a 3. Si todavía tiene problemas, elimine la opción -filter por completo y analice la salida.

gwmi win32_LogicalDisk -filter DriveType=3

Para wmic , si recibe "Expresión GET no válida", intente poner la expresión get entre comillas:

wmic logicaldisk get "caption,providername,drivetype,volumename"
tdowg1
fuente
2

Este sitio tiene un conjunto de llamadas mucho más simple:

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

Mostrar unidades locales:

wmic logicaldisk get deviceid, volumename, description


Si desea mostrar solo unidades de un tipo particular, el comando wmic puede expandirse aún más para incluir una cláusula where.

disco lógico wmic donde drivetype = 2 obtener deviceid, volumename, descripción

Tipos

0 => Desconocido

1 => Sin directorio raíz

2 => Disco extraíble

3 => Disco local

4 => Unidad de red

5 => Disco compacto

6 => Disco RAM

David Tr
fuente
2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause
5d4gd
fuente
Probé este y no funcionó. Creo que debe haber un espacio delante de los / s, pero incluso con ese cambio no funcionó. Puse lo anterior en un archivo, d.bat y veo que la ventana de la parte del disco parpadea pero luego desaparece y el shell de cmd donde estoy ejecutando esto muestra la pausa en ejecución.
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"

Encontré que el enfoque diskpart informa unidades de DVD sin disco insertado, y no informa tarjetas SD con volúmenes de unidad válidos

Mella
fuente
no funciona para 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
fuente
0

Algo torpe, pero funciona desde un archivo por lotes:

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

Aunque tiene suficiente respuesta, me gustaría agregar una cuando desee usarla en un archivo por lotes. Si obtiene "Expresión GET no válida", puede poner un ^ antes de ',', como a continuación:

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
fuente
¿Qué hace esto ^aquí?
vonbrand
Es el carácter de escape de cmd.exe, similar a \ en Unix como shells.
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
fuente
Um, wow Entonces, si puede destilar eso en algo que en realidad solo generaría las letras de unidad y las etiquetas que existen en el sistema, estaría más cerca de la respuesta a la pregunta, aunque este es el menor movimiento en la dirección correcta.
Chris Magnuson
¿Me van a rechazar por proporcionar una solución que cumpla con los criterios? Wow ...
Scott, el
44
Bueno, por un lado, produce errores para las unidades que existen pero que no contienen medios, como una unidad de CD / DVD.
Pausado hasta nuevo aviso.
+1 para la idea
Tyler Long
¡todos saluden el código chino!
LogicDaemon