(взято из моего старого ответа при сбое сервера)
Самый простой способ надежно получить доступ к свободному месту на диске - использовать WMI. При попытке проанализировать вывод dir
вы получите множество смешных проблем, по крайней мере, с версиями Windows на других языках. Вы можете использовать wmic
для запроса свободного места на диске:
wmic logicaldisk where "DeviceID='C:'" get FreeSpace
Это выведет что-то вроде
FreeSpace
197890965504
Вы можете принудительно вставить это в одну строку, добавив переключатель /format:value
:
> wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value
FreeSpace=197890965504
Однако там есть несколько пустых строк (около трех или четырех), которые плохо поддаются обработке. К счастью, команда for
может удалить их для нас, когда мы проводим токенизацию:
for /f "usebackq delims== tokens=2" %x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%x
Приятно то, что, поскольку мы используем только второй токен, все пустые строки (у которых нет второго токена) игнорируются.
Не забудьте удвоить знаки %
при использовании этого в командном файле:
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
Теперь вы можете использовать свободное пространство, которое хранится в переменной окружения %FreeSpace%
.
Получение процентов сейчас немного сложнее, поскольку командные файлы поддерживают только 32-разрядные целые числа для вычисления. Однако вам, вероятно, не нужно вычислять это до байта; Я думаю, что мегабайт вполне достаточно:
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get Size /format:value`) do set Size=%%x
set FreeMB=%FreeSpace:~0,-6%
set SizeMB=%Size:~0,-6%
set /a Percentage=100 * FreeMB / SizeMB
echo C: is %Percentage% % free
Это должно работать, если ваши объемы не превышают 20 ТиБ.