Сравнение 2 чисел в DOS Batch не работает - PullRequest
6 голосов
/ 14 октября 2011

Я старожил, который является новичком в пакетном программировании DOS. У меня есть то, что я считаю очень простым пакетным скриптом, который не работает. Я искал похожие посты и не нашел подходящего.

Я запускаю приведенный ниже скрипт на XP. Моя цель - проверить наличие свободного места на диске, прежде чем продолжить, но я столкнулся с проблемой , сравнивая 2 числа , поэтому приведенный ниже скрипт содержит только эту логику. У меня есть жестко запрограммированные числа, чтобы показать проблему, которая ... Сравнение (если x gtr y), похоже, не работает, и поэтому логика ветвления идет не туда. Либо так, либо я напортачил где-то еще в заявлении IF. (Некоторые из эхо-операторов не нужны, они предназначены для отладки, но я оставил их пока.)

Любое просвещение о том, где я иду не так, будет с благодарностью.

Thx ...

@echo off

set Free=217522712576
set Need=20000000000

echo Free=%Free%
echo Need=%Need%

echo on
IF %Free% GTR %Need% (GOTO Sufficient_Space) ELSE GOTO Insufficient_Space
@echo off

:Insufficient_Space
@ECHO INSUFFICIENT SPACE
GOTO DONE

:Sufficient_Space
@ECHO SUFFICIENT SPACE

:DONE

Ответы [ 3 ]

5 голосов
/ 14 октября 2011

Эти числа будут переполнены 32-битным целым числом, так что угадать ваш на 32-битной версии окон, поэтому его сбой.

4 голосов
/ 05 ноября 2011

Обратите внимание, что CMD имел точность между -2^31 до 2^31-1 что равно -2 147 483 648 до 2 147 483 647 Если меньше или больше, чем предел пришло предупреждение: Invalid number. Numbers are limited to 32-bits of precision.

3 голосов
/ 14 октября 2011

Как говорили другие, числа слишком велики, однако, если вы оставите их в виде строк и дополните их до одинаковой длины, это выглядит как работа

@echo off

rem cant do this get: Invalid number.  Numbers are limited to 32-bits of precision.
set Free=217522712576
set Need=2000000000

rem can do 
set Free=00000000000%Free%X
set free=%Free:~-13%

set Need=00000000000%Need%X
set Need=%Need:~-13%


echo Free=%Free%
echo Need=%Need%

echo on
IF %Free% GTR %Need% (GOTO Sufficient_Space) ELSE GOTO Insufficient_Space
@echo off

:Insufficient_Space
@ECHO INSUFFICIENT SPACE
GOTO DONE

:Sufficient_Space
@ECHO SUFFICIENT SPACE

:DONE
...