
Как получитьобщий размердиска или раздела (жесткий диск USB с 1 разделом NTFS) в пакетном файле?
Я бы предпочел не использовать логику, которая рекурсивно проходит по файлам (те, которые с /f), поскольку это диск объемом 1 ТБ, и определение размера может занять много времени.
Я открыт для использования небольшого стороннего инструмента, который вернет размер пакетного файла.
PS: У меня Windows 7 x64 Ultimate
решение1
Вероятно, есть более простой способ сделать это, но вот что использую я
Если вам нужны только байты, вы можете просто выполнить эту команду, изменив T на букву вашего внешнего диска (для однострочного ввода в командной строке измените %%
на %
и set space=
на 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.
[РЕДАКТИРОВАТЬ]
Дляобщийразмер, вы можете использовать diskpart list volume (изменить "%%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
решение2
Может быть, попробуйте 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 требует прав администратора, поэтому может не работать на заблокированных компьютерах.