1

Как получить общий размер диска или раздела (жесткого диска USB с 1 NTFS-разделом) в командном файле?
Я бы предпочел не использовать логику, которая рекурсивно просматривает файлы (те, что для /f), поскольку это диск объемом 1 ТБ, и для определения размера может потребоваться много времени.

Я открыт для использования небольшого стороннего инструмента, который будет возвращать размер в пакетный файл.

PS: я на Windows 7 x64 Ultimate

2 ответа2

3

Вероятно, есть более простой способ сделать это, но вот что я использую

Если все, что вам нужно, это байты, вы можете просто сделать эту команду, изменив T на букву диска вашего внешнего (для одной строки в командной строке измените %% на % и set space= to echo)

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

если вы хотите взять это и упростить, сначала установите рекомендации для каждого размера

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

Затем напишите временный сценарий VBS, так как пакет не может обработать математику

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

Запустите его, запишите результат и удалите его

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

Затем следующие обрезают результат до двух десятичных знаков

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

Эхо результаты

echo Drive has %space% %size% free.

[РЕДАКТИРОВАТЬ]

Для общего размера вы можете использовать том списка диска (измените "%%a"=="T" на "%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

и бонус, как вы могли бы рассчитать, что:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0
1

Может быть, попробуйте df.exe который доступен на http://unxutils.sourceforge.net/ и других местах. Это копия инструмента командной строки UNIX.

Вы также должны быть в состоянии получить значение непосредственно из интерфейса управления Windows (WMI), хотя, боюсь, мои навыки в этой области недостаточно хороши, чтобы дать прямой ответ.

fsutil volume diskfree c: даст вам 3 строки вывода, которые вы, вероятно, могли бы использовать для find желаемого результата.

Пример вывода:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes" дает вам конкретную строку.

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

дает вам номер с предыдущим пробелом.

Для сравнения:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

ПРИМЕЧАНИЕ: fsutil требует прав администратора, поэтому это может не работать на заблокированных компьютерах.

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