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


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

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

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.


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.


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

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"

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


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

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


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

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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.