Командная строка Windows получить дисковое пространство в ГБ

12

Я пытаюсь создать командный файл для извлечения общего размера и свободного места на диске C: \ серверов (локально запускаемый скрипт). Мне также нужно, чтобы вывод был легко читаемым, чтобы байты не работали, поэтому у меня все в порядке с командной строкой, которая создает временный файл .vbs.

Кажется, что следующее может сработать, но форматирование / математика неверны.

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%

Вышеприведенные команды также показывают только свободное пространство ... Мне бы тоже хотелось иметь общий размер ... Интересно, может ли быть лучше использовать следующую команду для извлечения информации:

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

Также обратите внимание, что я хочу, чтобы это можно было копировать / вставлять непосредственно в командную строку (не командный файл - принудительные требования). Я уже удалил "%%" из кода выше.

Примечание. Должен запускаться на сервере Server 2003+ (таким образом, отсутствует Powershell, а также любые сторонние утилиты).

BondUniverse
источник
какая версия windows?
EBGreen
Сервер 2003+, изначально. Обновите мой оригинальный пост, чтобы отразить это.
BondUniverse

Ответы:

10

В соответствии с предложением « не пакетный файл - принудительные требованияcmd » может помочь следующая строка:

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

Выход :

==>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
источник
11

Я понимаю, что вы сейчас выглядите как VBS, но PowerShell может сделать это очень легко:

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

Первая строка получает информацию о диске из WMI (в данном примере это просто C:) и выбирает только свободное пространство и общий размер.

В следующих двух строках запишите размеры свободного пространства и общего объема в консоль, отформатированные в ГБ, с отсеченными фракциями.

Пример вывода (как есть):

223GB total
125GB free
Ƭᴇcʜιᴇ007
источник
1
Забыл написать об этом ... Нужно, чтобы он работал на сервере 2003+ (поскольку в 2003 году Powershell не является родным, его нельзя использовать). Определенно было бы проще с Powershell, хотя!
BondUniverse
3

В пакетном файле вы можете получить размер диска в ГБ указанного диска с помощью сценария DiskPart. В этом примере я устанавливаю определенный индекс диска в соответствии с названием его модели (при условии, что на компьютере есть только один такой). Измените строку « SATA Disk » в соответствии с моделью вашего жесткого диска. Вы можете получить название модели, выполнив команду " wmic diskdrive get Model, Index " в cmd.

Конечно, вы можете использовать другое свойство диска в команде wmic - типа wmic diskdrive get /? чтобы получить список всех свойств диска, которые вы можете использовать.

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

Если вам просто нужно проверить, достаточно ли на диске свободного места (например, для установки или копирования чего-либо), вы можете попробовать запрос wmic следующим образом:

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

это прервет выполнение пакетного файла, если на C осталось менее 10 Гб:

anilech
источник
2

Разделите на 1024, чтобы получить кибайты (2 ^ 10). Разделите на 1024 x 1024, чтобы получить Мибайты (2 ^ 20). Разделите на 1024 x 1024 x 1024, чтобы получить Gibytes (2 ^ 30).

Windows называет эти единицы килобайтами, мегабайтами и гигабайтами по историческим причинам. Я думаю, что мой корпус правильный.

Так что меняйте свои суммы.

вызывать
источник