Como obter uma lista de letras de unidade em um sistema através de um shell do Windows (bat, cmd)?

25

Como obtenho uma lista de letras de unidades e seus rótulos associados em um sistema Windows através de um arquivo bat?

Chris Magnuson
fonte

Respostas:

36

Isso obterá a maior parte:

Net Use

Se você tiver alguma unidade mapeada via subst, também precisará obter:

Subst

Para ser completo, você faria assim no Powershell (se você estiver no Windows 7 ou o instalou):

gwmi win32_LogicalDisk -filter DriveType=4

Você também pode fazer isso no prompt de comando ou em um arquivo em lotes usando o WMI, assim:

wmic logicaldisk get caption,providername,drivetype,volumename
EBGreen
fonte
11
Isso não lista as unidades de disco local, como qualquer disco rígido interno ou CD-ROM. Estou esquecendo de algo?
22620 Chris Magnuson
Não, eu entendi mal a pergunta. Eu pensei que você só queria unidades mapeadas. Eu vou editar.
EBGreen
2
A solução wmic deve fornecer tudo.
EBGreen
É necessário remover as aspas do wmic logicdisk get "legenda, nome do provedor, tipo de unidade" para que seja wmic logicdisk obter legenda, nome do usuário, tipo de unidade, caso contrário, gera um erro. EBGreen, você me surpreendeu sozinho por um dia, nunca vi o wmic, apesar de estar criando scripts de várias versões de servidor há semanas e estou extremamente empolgado em ver o que mais posso fazer com isso. Bom trabalho!
22620 Chris Magnuson
11
wmic logicdisk obter legenda, nome do usuário, tipo de unidade, nome do volume, o nome do volume estava faltando, se você atualizar o seu com isso, aceitarei como resposta. Obrigado
Chris Magnuson
15

Para usar o diskpart, não há necessidade de criar um arquivo intermediário. Experimentar:

echo list volume | diskpart
gnoise
fonte
2
Essa é a melhor resposta e retorna o máximo de informações sobre as unidades montadas em um formato bonito.
ekerner
mas requer direitos de administrador
LogicDaemon 1/17/17
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, flexível e eficiente. Embora um pouco complexo.

Dharma Leonardi
fonte
Não sei em que versões do Windows isso funciona, mas eu apenas o testei nas máquinas Win 7 e XP e obtive a seguinte saída de ambas: `DRIVE LETTER (s): USED:" = "DRIVE LETRA (S): GRÁTIS: "! TMP_FREE_DRIVE_LETTERS!" `
John Gardeniers
Desculpe, você precisa colocar isso no início do arquivo em lotes. setlocal enabledelayedexpansion
Dharma Leonardi
Editei sua resposta para incluir a linha que faltava. Funciona agora. +1
John Gardeniers
7

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

também mostra a letra da unidade de CD. não precisa ser administrador.

Yuning
fonte
simples e obras
Tyler Longo
"Eu era inesperado neste momento."
Berit Larsen
@BeritLarsen, você precisará dobrar% de símbolos se estiver executando-o como um arquivo em lotes, e não na linha de comando.
TessellatingHeckler
5
mountvol

saída de amostra

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

Se alguém tiver a sorte de usar o Vista (Vista Ultimate SP2 b6002, no meu caso) e os trechos gwmi e wmic fornecidos aqui não funcionarem exatamente, aqui está o que eu fiz para fazê-lo funcionar.

Para gwmi , se você não receber saída, tente alterar o DriveType para 3. Se ainda estiver com problemas, remova a opção -filter completamente e analise a saída.

gwmi win32_LogicalDisk -filter DriveType=3

Para wmic , se você receber "Expressão GET inválida", tente colocar a expressão get entre aspas:

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

Este site possui um conjunto de chamadas muito mais simples:

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

Mostrar unidades locais:

wmic logicdisk get deviceid, nome do volume, descrição


Se você deseja mostrar apenas unidades de um tipo específico, o comando wmic pode ser expandido ainda mais para incluir uma cláusula where.

wmic logicdisk onde drivetype = 2 obtém deviceid, nome do volume, descrição

Tipos

0 => Desconhecido

1 => Nenhum diretório raiz

2 => Disco removível

3 => Disco Local

4 => Unidade de Rede

5 => Disco compacto

6 => Disco RAM

David Tr
fonte
2
@echo off
echo list volume > scriptdiskpart
diskpart/s scriptdiskpart
del scriptdiskpart
pause
5d4gd
fonte
Eu tentei este e não funcionou. Eu acho que precisa haver um espaço na frente do / s, mas mesmo com essa mudança, não funcionou. Coloquei o item acima em um arquivo, d.bat, e a janela diskpart pisca, mas depois desaparece e o shell do cmd em que estou executando isso mostra a pausa em execução.
precisa
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"

Descobri que a abordagem diskpart relata unidades de DVD sem disco inserido e não relata cartões SD com volumes válidos

usuario
fonte
não funciona para o 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
fonte
0

Um pouco kludgy, mas funciona a partir de um arquivo em lotes:

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

Embora tenha resposta suficiente, eu gostaria de adicionar uma quando você quiser usá-la no arquivo em lotes. Se você obtiver "Expressão GET inválida", poderá colocar um ^ antes do ',', como abaixo:

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
fonte
O que isso ^faz aqui?
vonbrand
É o caractere de escape do cmd.exe, semelhante a \ no Unix como conchas.
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
fonte
Uau. Portanto, se você puder destilar isso em algo que realmente apenas produza as letras e as etiquetas de unidade existentes no sistema, estaria mais próximo da resposta à pergunta, embora esse seja o menor movimento na direção certa.
22620 Chris Magnuson
Estou recebendo votos negativos por fornecer uma solução que atenda aos critérios? Uau ...
Scott
4
Bem, por um lado, produz erros para unidades que existem, mas não contêm mídia, como uma unidade de CD / DVD.
Pausado até novo aviso.
+ 1 para a idéia #
Tyler Long
todos saudam o código chinês!
precisa saber é o seguinte