2011-10-14 29 views
6

Soy un veterano que es un novato en la programación por lotes de DOS. Tengo lo que creo que es una secuencia de comandos por lotes muy simple, que es no trabajando. Busqué publicaciones similares, y no encontré ninguna que coincida.Comparando 2 números en DOS Lote que no funciona

Estoy ejecutando el script siguiente en XP. Mi objetivo es comprobar el espacio libre en el disco antes de seguir adelante, pero me encontré con un problema comparando 2 números, por lo que el siguiente script contiene solo esa lógica. Tengo números codificados para mostrar el problema, que es ... La comparación (si xgtr y) parece no funcionar, por lo que la lógica de la rama va al lugar equivocado. O eso, o estoy arruinando en otro lugar en la declaración IF. (Algunas de las declaraciones de eco son innecesarias, están para la depuración, pero las dejé por ahora.)

Cualquier aclaración sobre dónde me estoy equivocando sería GRANMENTE apreciada.

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 
+2

I t Creo que descubrí esto. Creo que los números son DEMASIADO GRANDES. Si hago que ambos números sean 1 dígito más pequeños, pero igual con la misma relación de tamaño, ¡funciona perfectamente! Tendré que modificar mi script para hacer lo mismo. Es decir, reducir los números manteniendo su relación de tamaño igual. Gracias por escuchar :-) (Y, gracias a Alex K. por reformatear mi código! Supongo que si miro con atención en este sitio, veré las instrucciones sobre cómo hacerlo yo mismo, ¿no?) – feenyman99

Respuesta

5

Esos números podrían desbordar un entero de 32 bits para adivinar su en una versión de 32 bits de Windows, por lo que su fracaso.

C:\>set /a test=1+2 
3 

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

Como otros dijeron que los números son demasiado grandes, sin embargo, si usted los mantiene como cadenas y la almohadilla de ser de la misma longitud, se ve a trabajar

@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 
4

en cuenta que CMD Had A betweeb precisión -2^31 a 2^31-1 que igual a -2 147 483 648 a 2 147 483 647 Si es menor de grande que el límite llegó una advertencia: Invalid number. Numbers are limited to 32-bits of precision.