Obter tamanho do disco / partição no arquivo em lotes

1

Como obter o tamanho total de um disco ou partição (um disco rígido USB com 1 partição NTFS) em um arquivo em lotes?
Prefiro não usar a lógica que repassa arquivos recursivamente (aqueles com / f), pois é uma unidade de 1 TB e pode levar muito tempo para determinar o tamanho.

Estou aberto a usar alguma pequena ferramenta de terceiros que retornará o tamanho ao arquivo em lotes.

PS: Estou no Windows 7 x64 Ultimate

tumchaaditya
fonte
Estou assumindo o sistema operacional Windows a partir do texto da pergunta, mas que versão? Você poderia atualizar as tags e o texto da pergunta.
Julian Knight

Respostas:

3

Provavelmente existe uma maneira mais fácil de fazer isso, mas aqui está o que eu uso

Se tudo o que você deseja são bytes, basta executar este comando, altere T para a letra da unidade externa (para um liner no prompt de comando, altere %%para %e set space=para echo)

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

se você quiser pegá-lo e simplificá-lo, primeiro defina diretrizes para cada tamanho

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

Em seguida, escreva um script VBS temporário, pois o lote não pode lidar com a matemática

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

Execute-o, capture o resultado e exclua-o

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

Em seguida, o seguinte apara o resultado em duas casas decimais

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

Resultados de eco

echo Drive has %space% %size% free.

[EDITAR]

Para o tamanho total , você pode usar o volume da lista de partições de disco (altere "%%a"=="T"para "%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

e bônus como você pode calcular isso:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0
Patrick Meinecke
fonte
Eu acredito que isso é para espaço livre. Eu quero o tamanho total. Basicamente, desejo executar algum comando apenas se o tamanho da unidade for menor que 32 GB. Acho que vai ter que fazer a matemática então ..
tumchaaditya
Isso é realmente mais fácil, veja minha edição para solução para o tamanho total.
Patrick Meinecke 27/02
Obrigado cara .. Apenas uma edição .. as fichas precisam ser 3,7,8 no meu caso .. pode ser diskpart está mostrando uma coluna extra ... mais uma coisa ... eu não entendi direito a parte "in ( 'volume da lista de ecos ^ | diskpart') "... como funciona? porque se eu quiser fazer isso manualmente, primeiro terei que executar o diskpart e depois listar o volume .... como ele canaliza o volume da lista dentro do diskpart?
tumchaaditya
se você digitar echo list volume | diskpart, verá que list volumeé ecoado diskpart, isso pode ser feito na linha de comando, desde que você escape |. E não sei por que os tokens são diferentes para você, mas estou feliz que você possa descobrir isso.
Patrick Meinecke
outro nome problem..volume pode ou não pode conter espaços ... então delims mudar a cada vez
tumchaaditya
1

Talvez tente o df.exeque está disponível em http://unxutils.sourceforge.net/ e em outros locais. Esta é uma cópia de uma ferramenta de linha de comando UNIX.

Você também deve conseguir obter o valor diretamente da Interface de Gerenciamento do Windows (WMI), embora eu tenha medo que minhas habilidades nessa área não sejam boas o suficiente para dar uma resposta direta.

fsutil volume diskfree c:lhe dará três linhas de saída que você provavelmente poderia usar um findon para obter o resultado desejado.

Exemplo de saída:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes" fornece uma linha específica.

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

fornece o número com um espaço anterior.

Para uma comparação:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

NOTA: O fsutil requer direitos de administrador, portanto, isso pode não funcionar em computadores bloqueados.

Julian Knight
fonte
Obrigado cara. coisa fsutil funciona. Eu criei um procedimento para obter o tamanho final (apenas um para / f). Vou adicionar essas coisas à sua resposta e marcá-las como aceitas.
tumchaaditya
Eu atualizei a solução. Mas o que eu quero fazer é comparar esse tamanho com um número (32 GB convertidos em bytes para ser específico) e executar um comando se o tamanho for menor que 32 GB. Alguma idéia de como comparar essa string obtida com um número?
tumchaaditya
Tudo parece perfeito, exceto pelo tamanho do espaço livre. Mas, eu preciso do tamanho total da unidade ..
tumchaaditya
@tumchaadity é a última linha na saída do comando fsutil. Apenas mude o findtexto para combinar com a linha apropriada.
Julian Knight