Я пытаюсь определить, имеет ли целевой ПК по крайней мере 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 ГБ... Помогите, если Вы можете.
этот вопрос был тем, чего я основывал мой выше кода: Проверьте свободное пространство на диске с помощью Пакетных команд
кажется, что это должно работать, но это не делает.
Выньте "
со всего число, и сценарий работает почти правильно. Использование "
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 | найдите «bytes free»
вместо wmic logicdisk, где «DeviceID = 'C:'» получите FreeSpace / format: value
, если вы хотите избежать вызова WMI для этой операции (что позволяет нам опустить EnableDelayedExpansion
и используйте %
вместо !
около FreeSpaceBig
в строке 4. В любом случае, это сценарий, обычно есть много способов получить работа выполнена.
СВЯЗАННЫЕ:
https://stackoverflow.com/questions/293780/free-space-in-a-cmd-shell -values-batch-file / 9099542 # 9099542 https://stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working
У вас есть 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.
Вот другой способ сделать это ... но он не очень точный.
В этом методе используются операции длины строки с «количеством свободных байтов», указанным в 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 ГБ свободного места.
Я просто хотел поделиться этим неортодоксальным способом решения этой проблемы для тех, кто не Не люблю много кода.
Если вам просто нужно проверить, достаточно ли на диске свободного места (например, для установки или копирования чего-либо), вы можете попробовать запрос wmic следующим образом:
wmic LogicalDisk, где "DeviceID = ' c: 'и FreeSpace> 10737418240 "получить DeviceID 2> & 1 ^
| find / i "c:"> nul || (эхо: недостаточно места и выход 1)
выполнение командного файла прерывается, если на C меньше 10 ГБ: