8

Я пытаюсь создать командный файл, чтобы получить общий размер и свободное место на диске 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, а также любые сторонние утилиты).

5 ответов5

8

Под условием « не пакетный файл - обязательные требования » может помочь следующий однострочный 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

==>
5

Я понимаю, что вы сейчас выглядите как 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
1

В пакетном файле вы можете получить размер диска в ГБ указанного диска с помощью сценария 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
1

Если вам просто нужно проверить, достаточно ли на диске свободного места (например, для установки или копирования чего-либо), вы можете попробовать запрос 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 Гб:

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .