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


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

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

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.


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.


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

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"

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


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

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


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

0

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

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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.