Obtém o tamanho do disco / partição no arquivo de lote

1

Como obter tamanho total de um disco ou partição (um disco rígido USB com 1 partição NTFS) em um arquivo de lote?
Eu prefiro não ir para a lógica que passar por arquivos recursivamente (aqueles com / f), uma vez que é uma unidade de 1 TB e pode demorar um longo tempo para determinar o tamanho.

Estou aberto para usar uma pequena ferramenta de terceiros que retornará o tamanho do arquivo em lotes.

PS: estou no Windows 7 x64 Ultimate

    
por tumchaaditya 26.02.2013 / 18:40

2 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 os bytes, basta fazer esse comando alterar 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 pegar isso e simplificá-lo, primeiro defina as 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, 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 reduz o resultado para 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 do eco

echo Drive has %space% %size% free.

[EDITAR]

Para o tamanho total , você pode usar o volume da lista de partições em disco (alterar "%%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ê poderia 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
    
por 27.02.2013 / 03:57
1

Talvez tente df.exe , que está disponível no link e em outros locais. Esta é uma cópia de uma ferramenta de linha de comando do UNIX.

Você também deve conseguir obter o valor direto da interface de gerenciamento do Windows (WMI), embora receie que minhas habilidades nessa área não sejam boas o suficiente para fornecer uma resposta direta.

fsutil volume diskfree c: fornecerá 3 linhas de saída nas quais você provavelmente usará find 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: a fsutil exige direitos de administrador, portanto, isso pode não funcionar em computadores bloqueados.

    
por 26.02.2013 / 23:39