Сравнение 2 чисел в пакете DOS не работает

#batch-file #if-statement #dos #goto

#пакетный файл #оператор if #dos #goto

Вопрос:

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

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

Буду признателен за любое разъяснение того, где я ошибаюсь.

Спасибо…

 @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
  

Комментарии:

1. Я думаю, что я понял это. Я думаю, что цифры СЛИШКОМ БОЛЬШИЕ. Если я уменьшу оба числа на 1 цифру, но при этом сохраню одинаковое соотношение размеров, все будет работать просто отлично!! Мне придется изменить свой скрипт, чтобы сделать то же самое. То есть уменьшите числа, сохраняя их соотношение размеров неизменным. Спасибо за прослушивание 🙂 (И спасибо Алексу К. за переформатирование моего кода! Я полагаю, если я внимательно посмотрю на этот сайт, я увижу инструкции о том, как это сделать самому, да?)

Ответ №1:

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

 C:>set /a test=1 2
3

C:>set /a test=1 217522712576
Invalid number.  Numbers are limited to 32-bits of precision.
  

Ответ №2:

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

 @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
  

Ответ №3:

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