Чтобы расширить ответ Джоуи (исходный короткий), все выражение for анализируется сразу, а расширение% происходит во время анализа. Но нужного вам значения нет, пока не будет выполнено предложение DO. Вот почему вам нужно отсроченное расширение. Прочтите справку по for, набрав HELP FOR в командной строке.
Основываясь на комментарии к вашему предыдущему вопросу https://stackoverflow.com/a/9096601/1012053, похоже, что вы пытаются найти диск с наибольшим объемом свободного места > 1 ГБ.
Ваш текущий код имеет небольшой риск включения неправильной строки из команды DIR. Я изменил его для фильтрации вывода с помощью FINDSTR с регулярным выражением.
EDIT. Кроме того, команда IF не может корректно сравнивать числа, превышающие 2 147 483 647.
>if 2147483647 gtr 2147483646 echo greater
greater
>if 2147483648 gtr 2147483647 echo greater
>if 1000000000000 gtr 2147483647 echo greater
>if 2147483648 equ 2147483647 echo equal
equal
>if 1000000000000 equ 2147483647 echo equal
equal
Таким образом, числа должны иметь префикс 0, а команда IF должна выполнять сравнение строк вместо числового сравнения. Я заставил сравнение строк, заключив число с префиксом 0 в кавычки.
@echo off
setlocal enableDelayedExpansion
set "gbsize=1,073,741,824"
set "gbsize=%gbsize:,=%"
set "maxfree=000000000000000"
set "maxdrive="
for %%A in (C D) do (
for /f "tokens=3" %%B in ('dir %%A:\^|findstr /r /c:"^ *.* *Dir(s).*bytes free$"') do (
set "bytesfree=000000000000000%%B"
set "bytesfree=!bytesfree:,=!"
set "bytesfree=!bytesfree:~-15!"
if "!bytesfree!" gtr "!maxfree!" (
set "maxfree=!bytesfree!"
set "maxdrive=%%A:"
)
)
)
for /f "tokens=* delims=0" %%A in ("%maxfree%") do set maxfree=%%A
echo Drive with max free space is %maxdrive% %maxfree% bytes free
if %maxfree% gtr %gbsize% echo That is more than 1GB
Альтернативный метод с использованием WMIC
@echo off
setlocal enableDelayedExpansion
set "gbsize=1,073,741,824"
set "gbsize=%gbsize:,=%"
set "maxfree=000000000000000"
set "maxdrive="
for /f "skip=1 tokens=1,2" %%A in ('wmic volume get DriveLetter^, FreeSpace') do (
if "%%B" neq "" (
set "bytesfree=000000000000000%%B"
set "bytesfree=!bytesfree:~-15!"
if "!bytesfree!" gtr "!maxfree!" (
set "maxfree=!bytesfree!"
set "maxdrive=%%A"
)
)
)
for /f "tokens=* delims=0" %%A in ("%maxfree%") do set maxfree=%%A
echo Drive with max free space is %maxdrive% %maxfree% bytes free
if %maxfree% gtr %gbsize% echo That is more than 1GB
person
dbenham
schedule
01.02.2012