Проверка оставшегося места на жестком диске в пакетном скрипте DOS.ЕСЛИ условие не работает - PullRequest
0 голосов
/ 02 апреля 2012

Я хотел бы получить уведомление, информирующее меня о том, что на жестком диске мало места. Я использую Windows 7 Professional и думаю, что быстрый пакетный файл мог бы справиться с этим. Я планирую запускать его раз в день. Это то, что я до сих пор:

Находит оставшееся дисковое пространство с помощью команды "dir" и команды "find". Сохраняет значение в Var1. (Это работает для меня)

@echo off
FOR /F "tokens=*" %%i in ('dir ^| find "free"') do SET WinVer=%%i 
FOR /F "tokens=1-3 delims=]-" %%A IN ("%WinVer%" ) DO ( 
SET Var1=%%A 
)

Это вытягивает число из результата и удаляет запятые. Результат будет выглядеть как «111222333444» без кавычек: (это работает для меня)

set Var1=%Var1:~10,15%
set Var1=%Var1:,=%

Это проверяет, меньше ли значение в Var1 меньше 100 ГБ (мой гипотетический минимальный объем дискового пространства). Если это так, он создает файл с именем "lowSpace.txt", который я увижу в какой-то момент. (Это не работает для меня)

if %Var1% leq 100000000000 dir > lowSpace.txt

Это утверждение "если" вызывает у меня проблемы. Мое свободное дисковое пространство составляет около 150 ГБ (или 150000000000), поэтому условие if должно завершиться неудачно, и файл «dir> lowSpace.txt» не должен быть запущен, но в любом случае он работает.

  • Если я увеличу константу в операторе «if» с 100000000000 до 500000000000, файл «lowSpace.txt» будет создан, как я ожидал.

  • Или, если я снова увеличу константу с 100000000000 до 500000000000 и изменим условие с «leq» на «geq», файл «lowSpace.txt» будет создан, когда я ожидаю, что он не будет создан.

Я неправильно сравниваю свои числа? Или что-то не так с моим утверждением "если"? Кажется, что код рассматривает 150 ГБ как больше, так и меньше, чем 100 ГБ.


Вот мой полный сценарий:

@echo off
FOR /F "tokens=*" %%i in ('dir ^| find "free"') do SET WinVer=%%i 
FOR /F "tokens=1-3 delims=]-" %%A IN ("%WinVer%" ) DO ( 
SET Var1=%%A 
) 
set Var1=%Var1:~10,15%
set Var1=%Var1:,=%

if %Var1% leq 100000000000 dir > lowSpace.txt
@echo on
@echo %Var1%

Обратите внимание, что 100 ГБ - это не мой настоящий объем пространства на жестком диске. Я просто использую этот номер для проверки своего кода.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

Я задавал этот вопрос и отвечал на него Пакетный файл Windows, ЕСЛИ сбой - Как 30000000000000 может равняться 40000000000? .Ваша проблема в том, что пакет Windows не может обработать числа, превышающие ~ 2 ГБ.If обрабатывает любое число больше 2 ГБ как равное 2 ГБ.Я опубликовал простую работу с префиксами чисел с нулями и принудительным сравнением строк вместо числового сравнения.

Обратите внимание, вы также можете использовать WMIC для получения свободного места на любом диске:

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set freeSpace=%%S
1 голос
/ 12 августа 2013

wmic команда иногда недоступна.

Итак, в единственной строке:

for /F "tokens=8" %%? in ('fsutil volume diskfree C:') do set FREE_SPACE=%%?

Результат находится в переменной %FREE_SPACE% в bytes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...