Wiersz poleceń systemu Windows uzyskać miejsce na dysku w GB

12

Próbuję utworzyć plik wsadowy, aby pobrać całkowity rozmiar i wolne miejsce na dysku C: \ serwerów (lokalnie uruchamiany skrypt). Potrzebuję również, aby dane wyjściowe były łatwe do odczytania, więc bajty nie będą działać, więc nie mam nic przeciwko linii poleceń, która tworzy plik temp .vbs.

Wygląda na to, że może to działać, ale formatowanie / matematyka jest nieprawidłowe.

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%

Powyższe polecenia pokazują również tylko wolne miejsce ... Chciałbym też całkowity rozmiar ... Zastanawiam się, czy poniższe polecenie może być lepsze do pobierania informacji:

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

Zauważ też, że chcę, aby można było to skopiować / wkleić bezpośrednio w wierszu polecenia (nie wymuszone przez plik wsadowy). Usunąłem już „%%” z powyższego kodu.

Uwaga: Musi działać natywnie na serwerze 2003+ (więc program PowerShell jest niedostępny, podobnie jak wszelkie narzędzia innych firm).

BondUniverse
źródło
jaka wersja systemu Windows?
EBGreen
Serwer 2003+, natywnie. Zaktualizuj mój oryginalny post, aby to odzwierciedlić.
BondUniverse

Odpowiedzi:

10

Zgodnie z klauzulą ​​„ wymuszone wymagania ”, następny cmdjeden wiersz może pomóc:

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

Wyjście :

==>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
źródło
11

Zdaję sobie sprawę, że wyglądasz teraz jak VBS, ale PowerShell może to zrobić bardzo łatwo:

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

Pierwszy wiersz pobiera informacje o dysku z WMI (po prostu robi C: w tym przykładzie) i wybiera tylko wolne miejsce i całkowite rozmiary.

W następnych dwóch wierszach napisz do konsoli rozmiary wolnego miejsca i całkowite, sformatowane w GB, z obciętymi ułamkami.

Przykładowe dane wyjściowe (takie, jakie są):

223GB total
125GB free
Ƭᴇcʜιᴇ007
źródło
1
Zapomniałem dodać notatkę na ten temat ... Musisz działać natywnie na serwerze 2003+ (ponieważ Powershell nie jest natywny w 2003 roku, nie może go używać). Zdecydowanie byłoby łatwiej z Powershell!
BondUniverse
3

W pliku wsadowym można uzyskać rozmiar dysku w GB określonego dysku za pomocą skryptu DiskPart. W tym przykładzie ustawiam konkretny indeks dysku zgodnie z jego nazwą modelu (zakładając, że na komputerze jest tylko jeden podobny). Zmień ciąg „ SATA Disk ”, aby pasował do modelu napędu. Możesz uzyskać nazwę modelu, uruchamiając polecenie „ wmic diskdrive get Model, Index ” w cmd.

Oczywiście możesz użyć innej właściwości dysku w poleceniu wmic - wpisz wmic diskdrive get /? aby uzyskać listę wszystkich właściwości dysku, których możesz użyć.

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
źródło
3

Jeśli musisz tylko sprawdzić, czy na dysku jest wystarczająca ilość wolnego miejsca (na przykład w celu zainstalowania lub skopiowania czegoś), możesz wypróbować zapytanie wmic w następujący sposób:

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

spowoduje to przerwanie wykonywania pliku wsadowego, jeśli na C jest mniej niż 10 Gb:

anilech
źródło
2

Podziel przez 1024, aby uzyskać kibajty (2 ^ 10). Podziel przez 1024 x 1024, aby uzyskać Mibytes (2 ^ 20). Podziel przez 1024 x 1024 x 1024, aby uzyskać Gibajty (2 ^ 30).

System Windows nazywa te jednostki kilobajtami, megabajtami i gigabajtami z powodów historycznych. Myślę, że moja obudowa ma rację.

Więc zmień swoje sumy.

wyzwalacz
źródło