2011-10-14 39 views
6

我是一个DOS批处理编程新手。我有什么我认为是一个非常简单的批处理脚本,即不是工作。我寻找类似的帖子,并没有找到一个匹配。在DOS中比较2个数字批处理不工作

我在XP上运行下面的脚本。我目标是进一步处理之前检查可用磁盘空间,但我遇到了比较2号问题,所以下面的脚本仅包含逻辑。我有硬编码的数字来显示问题,这是...比较(如果x gtr y)似乎不工作,所以分支逻辑去错了地方。要么是这样,要么我在IF声明的其他地方搞乱了。 (有些echo语句是不必要的 - 它们是调试 - 但我留在了现在。)

上我要去哪里错将不胜感激任何启示。

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

余吨我想到了这一点。我认为这些数字太大了。如果我把两个数字缩小一个数字,但仍然具有相同的尺寸关系,它的工作原理很好! 我将不得不修改我的脚本来做同样的事情。也就是说,缩小数字的同时保持它们的大小关系相同。 感谢名单听:-) (而且,感谢名单给Alex K.重新格式化我的代码!我想,如果我仔细看这个网站,我会看看如何做这说明我自己,是吗?) – feenyman99

回答

5

这些数字将溢出32位整数,在Windows的32位版本,因此猜你的,这就是为什么它的失败。

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

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

正如有人说的数字是太大,但是如果你把它们当做字符串,垫出来是一样的长度,它看起来工作

@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

注意,CMD有一个精密betweeb -2^312^31-1 那等于-2 147 483 6482 147 483 647 如果小于极限 一个警告是更大:Invalid number. Numbers are limited to 32-bits of precision.