Я пытаюсь определить, есть ли на целевом компьютере как минимум 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 ГБ ... Пожалуйста, помогите, если сможете.
этот вопрос был тем, на чем я основал свой код выше: Проверьте свободное место на диске с помощью пакетных команд
кажется, что это должно работать, но это не так.
У вас есть 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 примерно по номеру, и скрипт работает почти правильно. Используя "
s вызывает сравнение строк вместо числового.
Как отмечает dbenham, CMD хранит (и сравнивает) числа только как 32-битные целые числа со знаком. Поскольку мы проверяем ГБ, мы можем проигнорировать несколько менее значимых цифр. Если мы удалим последние 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#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 ГБ свободного места.
Я просто хотел поделиться этим неортодоксальным способом решения этой проблемы для тех, кто не любит много кода.