La riga di comando di Windows ottiene spazio su disco in GB


12

Sto cercando di creare un file batch per estrarre la dimensione totale e lo spazio libero dell'unità C: \ dei server (script eseguito localmente). Ho anche bisogno che l'output sia facilmente leggibile, quindi i byte non funzioneranno, quindi sto bene con una riga di comando che crea un file .vbs temporaneo.

Quanto segue potrebbe funzionare, ma la formattazione / matematica non è corretta.

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%

I comandi sopra mostrano anche solo spazio libero ... Vorrei anche la dimensione totale ... Mi chiedo se il seguente comando potrebbe essere migliore per estrarre le informazioni:

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

Nota anche che voglio che questo possa essere copiato / incollato direttamente in un prompt dei comandi (non un file batch - requisiti forzati). Ho già rimosso "%%" dal codice sopra.

Nota: deve essere eseguito in modo nativo su Server 2003+ (quindi Powershell è fuori uso, nonché eventuali utility di terze parti).


quale versione di windows?
EBGreen

Server 2003+, nativamente. Aggiorna il mio post originale per riflettere questo.
BondUniverse

Risposte:


10

Sotto la clausola non un file batch - requisiti obbligatori , il prossimo cmdone-liner potrebbe aiutare:

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

Uscita :

==>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

==>

11

Mi rendo conto che stai cercando VBS in questo momento, ma PowerShell può farlo molto facilmente:

$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))

La prima riga ottiene le informazioni sul disco da WMI (fa solo C: in questo esempio) e seleziona solo le dimensioni di spazio libero e totale.

Nelle prossime due righe scrivi le dimensioni di Spazio libero e Totale sulla console, formattate in GB, con le frazioni troncate.

Esempio di output (così com'è):

223GB total
125GB free

1
Hai dimenticato di mettere un appunto al riguardo ... Ne hai bisogno per funzionare in modo nativo su Server 2003+ (dal momento che Powershell non è nativo nel 2003, non può usarlo). Sicuramente sarebbe stato più facile con Powershell!
BondUniverse

3

In un file batch, è possibile ottenere la dimensione del disco in GB di un disco specificato utilizzando uno script DiskPart. In questo esempio, sto impostando l'indice del disco specifico in base al nome del suo modello (supponendo che ce ne sia solo uno simile nel computer). Modificare la stringa " SATA Disk " in modo che corrisponda al modello dell'unità disco. È possibile ottenere il nome del modello eseguendo il comando " wmic diskdrive get Model, Index " in cmd.

Naturalmente, è possibile utilizzare una diversa proprietà del disco nel comando wmic: digitare wmic diskdrive get /? per ottenere un elenco di tutte le proprietà del disco che è possibile utilizzare.

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

3

Se hai solo bisogno di controllare se l'unità ha abbastanza spazio libero (per installare o copiare qualcosa per esempio) puoi provare query wmic in questo modo:

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

questo interromperà l'esecuzione del file batch se su C è disponibile meno di 10 Gb:


2

Dividi per 1024 per ottenere kibyte (2 ^ 10). Dividi per 1024 x 1024 per ottenere Mibyte (2 ^ 20). Dividi per 1024 x 1024 x 1024 per ottenere Gibytes (2 ^ 30).

Windows chiama queste unità kilobyte, Megabyte e Gigabyte per motivi storici. Penso che il mio involucro sia giusto.

Quindi cambia le tue somme.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.