Linha de comando do Windows obter espaço em disco em GB

12

Estou tentando criar um arquivo em lotes para extrair o tamanho total e o espaço livre da unidade C: \ de servidores (script executado localmente). Também preciso que a saída seja facilmente legível, para que bytes não funcione, por isso estou bem com uma linha de comando que cria um arquivo .vbs temporário.

Parece que o seguinte poderia 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 espaço livre ... Gostaria também de tamanho total ... Pensando se o seguinte comando pode ser melhor para obter as informações:

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

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

Nota: Precisa ser executado de forma nativa no Server 2003+ (para que o Powershell esteja fora, bem como quaisquer utilitários de terceiros).

BondUniverse
fonte
qual versão do windows?
EBGreen
Server 2003+, nativamente. Atualize minha postagem original para refletir isso.
BondUniverse

Respostas:

10

Sob a cláusula não um arquivo em lote - requisitos forçados , a próxima linha cmdúnica pode 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

==>
JosefZ
fonte
11

Sei que você está parecendo 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 Espaço Livre e Total.

Nas próximas duas linhas, grave os tamanhos Espaço Livre e Total no console, formatado para ser em GB, com as frações truncadas.

Exemplo de saída (como está):

223GB total
125GB free
Ƭᴇcʜιᴇ007
fonte
11
Esqueceu-se de colocar uma observação sobre isso ... Precisa que ele funcione nativamente no Server 2003+ (já que o Powershell não é nativo em 2003, não pode usá-lo). Definitivamente teria sido mais fácil com o Powershell!
BondUniverse
3

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

Obviamente, você pode usar uma propriedade diferente do disco no comando wmic - digite wmic diskdrive get /? para obter uma lista de todas as propriedades do 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
Eric
fonte
3

Se você apenas precisar verificar se a unidade possui espaço livre suficiente (para instalar ou copiar algo, por exemplo), tente a consulta wmic como esta:

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:

anilech
fonte
2

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 minha caixa está certa.

Então mude suas somas.

desencadear
fonte