Baris Perintah Windows mendapatkan ruang disk dalam GB

12

Saya mencoba membuat file batch untuk menarik ukuran total dan ruang kosong drive C: \ server (skrip yang dijalankan secara lokal). Saya juga membutuhkan output agar mudah dibaca, sehingga byte tidak akan berfungsi, jadi saya baik-baik saja dengan memiliki baris perintah yang membuat file temp .vbs.

Berikut ini sepertinya bisa bekerja, tetapi pemformatan / matematika tidak benar.

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%

Perintah di atas juga hanya menunjukkan ruang kosong ... Saya ingin ukuran total juga ... Ingin tahu apakah perintah berikut ini mungkin lebih baik untuk menarik info:

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

Perhatikan juga bahwa saya ingin ini dapat disalin / ditempelkan langsung ke prompt perintah (bukan file batch - persyaratan yang dipaksakan). Saya sudah menghapus "%%" dari kode di atas.

Catatan: Perlu dijalankan secara native di Server 2003+ (jadi Powershell tidak ada, serta semua utilitas pihak ke-3).

BondUniverse
sumber
versi windows apa?
EBGreen
Server 2003+, secara asli. Perbarui posting asli saya untuk mencerminkan ini.
BondUniverse

Jawaban:

10

Di bawah bukan file batch - klausa persyaratan paksa , cmdone-liner berikutnya dapat membantu:

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

Keluaran :

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

Saya menyadari Anda sedang mencari sebagai VBS sekarang, tetapi PowerShell dapat melakukan ini dengan sangat mudah:

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

Baris pertama mendapatkan info disk dari WMI (seperti C: dalam contoh ini), dan hanya memilih Ruang Kosong dan ukuran Total.

Dalam dua baris berikutnya tulis Ruang Kosong dan Total ukuran ke konsol, diformat dalam GB, dengan pecahan terpotong.

Contoh output (apa adanya):

223GB total
125GB free
Ƭᴇcʜιᴇ007
sumber
1
Lupa untuk membuat catatan tentang itu ... Perlu untuk bekerja secara native di Server 2003+ (karena Powershell bukan asli pada tahun 2003, tidak dapat menggunakannya). Pastinya akan lebih mudah dengan Powershell!
BondUniverse
3

Dalam file batch, Anda bisa mendapatkan ukuran disk dalam GB disk yang ditentukan dengan menggunakan skrip DiskPart. Dalam contoh ini, saya mengatur indeks disk spesifik sesuai dengan nama modelnya (dengan asumsi hanya ada satu seperti itu di komputer). Ubah string " Disk SATA " agar sesuai dengan model drive disk Anda. Anda bisa mendapatkan nama model dengan menjalankan perintah " wmic diskdrive get Model, Index " di cmd.

Tentu saja, Anda dapat menggunakan properti disk yang berbeda di perintah wmic - ketik wmic diskdrive get /? untuk mendapatkan daftar semua properti disk yang dapat Anda gunakan.

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
sumber
3

Jika Anda hanya perlu memeriksa apakah drive memiliki ruang kosong yang cukup (untuk menginstal atau menyalin sesuatu misalnya), Anda dapat mencoba kueri wmic seperti ini:

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

ini akan merusak eksekusi file batch jika kurang dari 10Gb gratis di C:

Anilech
sumber
2

Bagilah dengan 1024 untuk mendapatkan kibytes (2 ^ 10). Bagi dengan 1024 x 1024 untuk mendapatkan Mibytes (2 ^ 20). Bagi dengan 1024 x 1024 x 1024 untuk mendapatkan Gibytes (2 ^ 30).

Windows menyebut unit ini kilobyte, Megabita, dan Gigabita karena alasan historis. Saya pikir casing saya benar.

Jadi, ubah jumlah Anda.

pelatuk
sumber