Определите, имеет ли диск 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 ГБ... Помогите, если Вы можете.

этот вопрос был тем, чего я основывал мой выше кода: Проверьте свободное пространство на диске с помощью Пакетных команд

кажется, что это должно работать, но это не делает.

7
задан 13 April 2017 в 15:14
4 ответа

Выньте " со всего число, и сценарий работает почти правильно. Использование " 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

3
ответ дан 2 December 2019 в 23:25

У вас есть 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.
11
ответ дан 2 December 2019 в 23:25

Вот другой способ сделать это ... но он не очень точный.

В этом методе используются операции длины строки с «количеством свободных байтов», указанным в 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 ГБ свободного места.

Я просто хотел поделиться этим неортодоксальным способом решения этой проблемы для тех, кто не Не люблю много кода.

-2
ответ дан 2 December 2019 в 23:25

Если вам просто нужно проверить, достаточно ли на диске свободного места (например, для установки или копирования чего-либо), вы можете попробовать запрос wmic следующим образом:

wmic LogicalDisk, где "DeviceID = ' c: 'и FreeSpace> 10737418240 "получить DeviceID 2> & 1 ^ | find / i "c:"> nul || (эхо: недостаточно места и выход 1)

выполнение командного файла прерывается, если на C меньше 10 ГБ:

0
ответ дан 2 December 2019 в 23:25

Теги

Похожие вопросы