Comment obtenir une liste de lettres de lecteur sur un système via un shell Windows (bat, cmd)?

25

Comment puis-je obtenir une liste des lettres de lecteur et leurs étiquettes associées sur un système Windows via un fichier bat?

Chris Magnuson
la source

Réponses:

36

Cela obtiendra l'essentiel:

Net Use

Si vous avez des disques mappés via subst, vous devrez également les obtenir:

Subst

Pour être complet, vous le feriez comme ceci dans Powershell (si vous êtes sous Windows 7 ou si vous l'avez installé):

gwmi win32_LogicalDisk -filter DriveType=4

Vous pouvez également le faire à partir de l'invite de commandes ou d'un fichier de commandes en utilisant WMI comme ceci:

wmic logicaldisk get caption,providername,drivetype,volumename
EBGreen
la source
1
Cela ne répertorie pas les lecteurs de disque locaux comme les disques durs internes ou les cdroms. Suis-je en train de manquer quelque chose?
Chris Magnuson
Non, j'ai mal compris la question. Je pensais que vous ne vouliez que des lecteurs mappés. Je vais éditer.
EBGreen
2
La solution wmic devrait vous donner tout.
EBGreen
Vous devez supprimer les guillemets de wmic logicdisk get "caption, providerername, drivetype" afin qu'il soit wmic logicdisk get caption, provideername, drivetype sinon il génère une erreur. EBGreen vous avez à moi seul soufflé l'esprit pour la journée, je n'ai jamais vu wmic même si j'ai écrit des scripts pour différentes versions de serveurs pendant des semaines et je suis extrêmement excité de voir ce que je peux faire d'autre avec. Bon travail!
Chris Magnuson
1
wmic logicdisk get caption, providerername, drivetype, volumename le VolumeName était ce qui me manquait, si vous mettez à jour le vôtre avec cela, je l'accepterai comme réponse. Merci
Chris Magnuson
15

Pour utiliser diskpart, il n'est pas nécessaire de créer un fichier intermédiaire. Essayer:

echo list volume | diskpart
gnoise
la source
2
C'est la meilleure réponse et renvoie le plus d'informations sur les disques montés dans un beau format.
ekerner
mais il nécessite des droits d'administrateur
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

Rapide, flexible et efficace. Bien qu'un peu complexe.

Dharma Leonardi
la source
Je ne sais pas sur quelles versions de Windows cela fonctionne, mais je viens de le tester sur mes machines Win 7 et XP et j'ai obtenu la sortie suivante des deux: `LETTRE (S) DE LECTEUR: UTILISÉ:" = "LETTRE (S) DE LECTEUR: GRATUIT: "! TMP_FREE_DRIVE_LETTERS!" `
John Gardeniers
Désolé, vous devez le mettre au début du fichier de commandes. setlocal enabledelayedexpansion
Dharma Leonardi
J'ai modifié votre réponse pour inclure la ligne manquante. Ça fonctionne maintenant. +1
John Gardeniers
7

inspiré par 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

affiche également la lettre du lecteur de CD. pas besoin d'être administrateur.

Yuning
la source
simple et fonctionne
Tyler Long
"j'étais inattendu en ce moment."
Berit Larsen
@BeritLarsen vous devez doubler% symboles si vous l'exécutez en tant que fichier batch plutôt que sur la ligne de commande.
TessellatingHeckler
5
mountvol

exemple de sortie

\\?\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
la source
4

Si quelqu'un a la chance d'utiliser Vista (Vista Ultimate SP2 b6002, dans mon cas) et que les extraits gwmi et wmic donnés ici ne fonctionnent pas exactement, voici ce que j'ai fait pour le faire fonctionner.

Pour gwmi , si vous ne recevez aucune sortie, essayez de changer le DriveType à 3. Si vous rencontrez toujours des problèmes, supprimez complètement l'option -filter et analysez la sortie.

gwmi win32_LogicalDisk -filter DriveType=3

Pour wmic , si vous recevez "Invalid GET Expression", essayez de mettre l' expression get entre guillemets:

wmic logicaldisk get "caption,providername,drivetype,volumename"
tdowg1
la source
2

Ce site a un ensemble d'appels beaucoup plus simple:

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

Afficher les lecteurs locaux:

wmic logicdisk get deviceid, volumename, description


Si vous souhaitez afficher uniquement les lecteurs d'un type particulier, la commande wmic peut être développée pour inclure une clause where.

wmic logicdisk où drivetype = 2 get deviceid, volumename, description

Les types

0 => Inconnu

1 => Pas de répertoire racine

2 => Disque amovible

3 => Disque local

4 => Lecteur réseau

5 => Disque compact

6 => Disque RAM

David Tr
la source
2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause
5d4gd
la source
J'ai essayé celui-ci et cela n'a pas fonctionné. Je pense qu'il doit y avoir un espace devant le / s mais même avec ce changement cela n'a pas fonctionné. Je mets ce qui précède dans un fichier, d.bat et je vois la fenêtre diskpart clignoter mais disparaît et le shell cmd où j'exécute ceci montre alors la pause en cours d'exécution.
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"

J'ai trouvé que l'approche diskpart signale les lecteurs de DVD sans disque inséré et ne signale pas les cartes SD avec des volumes de lecteur valides

Entaille
la source
ne fonctionne pas pour 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
la source
0

Un peu maladroit, mais fonctionne à partir d'un fichier batch:

echo LIST VOLUME > temp.txt && diskpart /s temp.txt && del /q temp.txt
Lien
la source
0

Bien qu'il ait suffisamment de réponses, je voudrais en ajouter un lorsque vous souhaitez l'utiliser dans un fichier batch. Si vous obtenez "Expression GET non valide", vous pouvez mettre un ^ avant le ',', comme ci-dessous:

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
la source
Qu'est-ce ^que cela fait ici?
vonbrand
C'est le caractère d'échappement de cmd.exe, similaire à \ dans Unix comme les 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
la source
Hum, wow. Donc, si vous pouvez distiller cela en quelque chose qui produirait simplement les lettres de lecteur et les étiquettes qui existent sur le système, qui seraient plus proches de la réponse à la question, bien que ce soit le moins de mouvement dans la bonne direction.
Chris Magnuson
Je reçois un vote négatif pour avoir proposé une solution répondant aux critères? Wow ...
Scott
4
Eh bien, d'une part, cela produit des erreurs pour les lecteurs qui existent mais ne contiennent aucun média, comme un lecteur de CD / DVD.
pause jusqu'à nouvel ordre.
+1 pour l'idée
Tyler Long
saluons tous le code chinois!
LogicDaemon