A linha de comandos do Windows obtém espaço em disco em GB

7

Estou tentando criar um arquivo de lote para extrair o tamanho total e o espaço livre da unidade C: \ dos servidores (script de execução local). Eu também preciso que a saída seja facilmente legível, então os bytes não funcionarão, então estou certo em ter uma linha de comando que cria um arquivo .vbs temporário.

O seguinte parece funcionar, mas a formatação / matemática não está correta.

setlocal
for /f "tokens=6" %a in ('fsutil volume diskfree C: ^| find "of bytes"') do set diskspace=%a
echo wsh.echo FormatNumber(cdbl(%diskspace%)/1024, 0) > %temp%.\tmp.vbs
for /f %a in ('cscript //nologo %temp%.\tmp.vbs') do set diskspace=%a
del %temp%.\tmp.vbs
echo For example %diskspace%

Os comandos acima também estão mostrando apenas o espaço livre ... Eu gostaria do tamanho total também ... Imaginando se o seguinte comando pode ser melhor para extrair as informações:

WMIC LOGICALDISK GET Name,Size,FreeSpace | find /i "C:"

Note também que eu quero que isso possa ser copiado / colado diretamente em um prompt de comando (não um arquivo em lotes - requisitos forçados). Eu já removi os "%%" do código acima.

Nota: Precisa ser executado nativamente no Server 2003+ (portanto, o Powershell está fora, assim como todos os utilitários de terceiros).

    
por BondUniverse 01.04.2015 / 18:41

5 respostas

8

Na cláusula não um arquivo em lotes - requisitos forçados , o próximo cmd one-liner poderia ajudar:

for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nologo %temp%\tmp.vbs & del %temp%\tmp.vbs

Saída :

==>for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FIND
STR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^
)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/
1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nolog
o %temp%\tmp.vbs & del %temp%\tmp.vbs

C: free=79,11 GiB size=111,45 GiB

D: free=929,47 GiB size=931,51 GiB

==>
    
por 07.06.2015 / 22:03
5

Sei que você está procurando como VBS agora, mas o PowerShell pode fazer isso com muita facilidade:

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Size, FreeSpace

Write-Host ("{0}GB total" -f [math]::truncate($disk.Size / 1GB))
Write-Host ("{0}GB free" -f [math]::truncate($disk.FreeSpace / 1GB))

A primeira linha obtém as informações do disco do WMI (apenas C: neste exemplo) e seleciona apenas os tamanhos de espaço livre e total.

Nas próximas duas linhas, escreva os tamanhos de espaço livre e total para o console, formatados em GB, com as frações truncadas.

Exemplo de saída (como é):

223GB total
125GB free
    
por 01.04.2015 / 18:56
1

Em um arquivo de lote, você pode obter o tamanho do disco em GB de um disco especificado usando um script DiskPart. Neste exemplo, estou definindo o índice de disco específico de acordo com o nome do modelo (supondo que exista apenas um como ele no computador). Altere a sequência " SATA Disk " para corresponder ao modelo da sua unidade de disco. Você pode obter o nome do modelo executando o comando " diskdrive wmic get Model, Index " no cmd.

Claro, você pode usar uma propriedade diferente do disco no comando wmic - digite diskdrive wmic get /? para obter uma lista de todas as propriedades de disco que você pode usar.

for /f %%I in ('wmic diskdrive get Model^, Index ^| find "SATA Disk"') do set DISK_Index=%%I

if not exist %~dp0Disk_Size.script (echo list disk > %~dp0Disk_Size.script)
@echo off
FOR /F "tokens=4 delims= " %%J in ('diskpart /s %~dp0Disk_Size.script ^| find "Disk %DISK_Index%"') do set DISK_SIZE=%%J
IF %ERRORLEVEL% EQU 1 (echo No Data was processed, cannot get DISK_SIZE)

echo DISK_SIZE is %DISK_SIZE% GB
    
por 16.07.2017 / 12:02
1

Se você só precisa verificar se a unidade tem espaço livre suficiente (para instalar ou copiar algo, por exemplo), você pode tentar uma consulta wmic assim:

wmic LogicalDisk where "DeviceID='c:' and FreeSpace > 10737418240" get DeviceID 2>&1 ^ | find /i "c:" >nul || (echo not enough space&exit 1)

isso interromperá a execução do arquivo em lote se houver menos de 10 GB livres em C:

    
por 19.02.2018 / 14:43
0

Divida por 1024 para obter kibytes (2 ^ 10). Divida por 1024 x 1024 para obter Mibytes (2 ^ 20). Divida por 1024 x 1024 x 1024 para obter Gibytes (2 ^ 30).

O Windows chama essas unidades de kilobytes, megabytes e gigabytes por motivos históricos. Eu acho que o meu estojo está certo.

Portanto, altere suas somas.

    
por 06.05.2015 / 13:14