Определите, имеет ли диск C 2 ГБ свободного дискового пространства
Я пытаюсь определить, есть ли на целевом ПК хотя бы 2 ГБ свободного места. Вот что у меня так далеко:
@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set "FreeSpace=%%x"
IF /i %FreeSpace% GTR "2147483648" (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
Не имеет значения, если я установил 2 ГБ или изменил его на 200 ГБ, он всегда говорит, что у меня достаточно места, даже если на этом диске только 90 ГБ... Пожалуйста, помогите, если можете.
этот вопрос был на чем я основывал свой код выше: Проверьте свободное место на диске с помощью пакетных команд
Кажется, это должно работать, но это не так.
4 ответа
У вас есть 2 проблемы с вашим кодом:
1) IF выполняет числовое сравнение только в том случае, если строка с обеих сторон оценивается как число. Ваша левая сторона числовая, но на правой стороне есть кавычки, что заставляет все сравнение выполняться с использованием семантики строк. Числовые цифры всегда сортируются выше, чем символ кавычки, поэтому всегда сообщают ИСТИНА.
Как подсказывает австралиец в своем ответе, удаление кавычек дает правильный ответ в вашем случае. Но это еще не все! На самом деле он проверяет, больше или равно свободное пространство 2147483647.
2) Номера пакетов Windows (cmd.exe) ограничены 32-битной точностью со знаком, что соответствует максимальному значению 2 ГБ -1 байт (2147483647). Оператор IF имеет странное (возможно, неудачное) поведение, когда любое число, большее 2147483647, рассматривается как равное 2147483647. Поэтому вы не можете использовать свою технику для проверки свободного пространства на значения, превышающие 2147483647.
См. https://stackoverflow.com/q/9116365/1012053 для получения дополнительной информации.
В ответе по ссылке описана методика, которую вы можете использовать для проверки больших чисел. Вы должны дополнить обе стороны условия левой и той же шириной и вызвать сравнение строк.
Например, следующее будет проверять, является ли свободное пространство>= 4294967296 (4 ГБ)
@echo off
setlocal
set "pad=000000000000000"
set "NeededSpace=%pad%4294967296"
for /f "delims== tokens=2" %%x in (
'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value'
) do for %%y in (%%x) do set "FreeSpace=%pad%%%y"
if "%FreeSpace:~-15%" geq "%NeededSpace:~-15%" echo Drive has at least 4 GB free space.
Вынуть "
с примерно числа, и сценарий почти работает правильно. С использованием "
s вызывает сравнение строк вместо числового сравнения.
Как отмечает dbenham, CMD хранит (и сравнивает) числа только как 32-разрядные целые числа со знаком. Поскольку мы проверяем наличие GB, мы можем разумно игнорировать несколько менее значимых цифр. Если мы удалим последние 6 цифр, то у нас останется разрешение в мегабайтах, и мы сможем правильно определить до 2 экзабайт свободного места. Также, как уже было отмечено, мы должны обрезать "Количество удаленных цифр" + 1 из результата WMIC из-за дополнительного символа в конце.
@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "FreeSpaceBig=%%x"
SET FreeSpace=!FreeSpaceBig:~0,-7!
IF %FreeSpace% GTR 2147 (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
ENDLOCAL
ПРИМЕЧАНИЕ: вам действительно не нужно /i
здесь также, так как это только для сравнения строк, и мы делаем целочисленное сравнение. Кроме того, мы могли бы использовать dir c:\ /-C | find "bytes free"
вместо wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value
, если вы хотите избежать вызова WMI для этой операции (что позволяет нам пропустить EnableDelayedExpansion
и использовать %
вместо !
вокруг FreeSpaceBig
на строке 4. Во всяком случае, это сценарии, как правило, есть много способов сделать работу.
СВЯЗАННЫЕ С:
https://stackoverflow.com/questions/293780/free-space-in-a-cmd-shell https://stackoverflow.com/questions/9099138/save-values-batch-file/9099542 https://stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working
Если вам просто нужно проверить, достаточно ли на диске свободного места (например, для установки или копирования чего-либо), вы можете попробовать запрос 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 Гб:
Вот другой способ сделать это... но это не очень точно.
Этот метод использует операции с длиной строки по отношению к "числу свободных байтов", указанному в dir
и свойства диска.
for /f "tokens=3" %%a in ('dir T:\') do (
set bytesfree=%%a
)
ECHO %bytesfree%>x&FOR %%? IN (x) DO SET /A strlen=%%~z? - 2&del x
IF %strlen% LEQ 13 (
)
Приведенный выше конкретный пример определяет, есть ли на диске T меньше 10 ГБ свободного места.
Я просто хотел поделиться этим неортодоксальным подходом для тех, кто не любит много кода.