Используется вывод команды dir
для извлечения свободного места. Весь тест прокручивается внутри подпрограммы, которая получает в качестве аргумента «диск» для проверки и количество требуемых байтов. При выходе он повышает уровень ошибок, когда свободного места недостаточно.
Арифметика в пакетных файлах ограничена 2^31 целыми знаками, поэтому для обработки значений больше 2147483647 и для работы с единицами хранения более 2 ГБ требуется дополнительный код. Чтобы этого избежать, вся информация указывается/извлекается в байтах, дополняется и сравнивается как строки.
@echo off
setlocal enableextensions disabledelayedexpansion
call :checkFreeSpace d: 123456789 && echo OK || echo No space
call :checkFreeSpace "\\10.0.0.1\c$" 2000000000
if errorlevel 1 (
echo No space
) else (
echo OK
)
goto :eof
:checkFreeSpace drive spaceRequired
setlocal enableextensions disabledelayedexpansion
set "pad=0000000000000000000000000"
set "required=%pad%%~2"
for %%d in ("%~1\.") do for /f "tokens=3" %%a in ('
dir /a /-c "%%~fd" 2^>nul ^| findstr /b /l /c:" "
') do set "freeSpace=%pad%%%a"
if "%freeSpace:~-25%" geq "%required:~-25%" exit /b 0
exit /b 1
примечание: Этот метод имеет один нюанс. Если указанная цель - это корень диска, и в нем нет файла/папки, команда dir
не найдет ничего, что можно было бы перечислить, и свободное пространство не будет включено в его вывод, что приведет к сбою теста, поскольку свободное пространство будет 0
О, вау, спасибо за отличный ответ. Знающе! Я должен признать, что у меня есть некоторые проблемы, которые заставляют его работать. Вероятно, я на новом стадионе. Я думаю, что моя первая проблема будет заключаться в том, как работает команда callfreepace: checkfreespace. Нужно ли мне что-то еще со сценарием? – MadsTheMan
@Excessium, опубликованный код показывает использование. Самый простой способ - скопировать/вставить подпрограмму в конце вашего пакетного файла и вызвать ее из вашего кода в качестве показа в образце. –
Хорошо, я ценю вашу помощь. Я попробую и сделаю все возможное завтра. Спасибо за ваш ответ. – MadsTheMan