#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.