2016-03-03 63 views
2

我有我的批处理文件,下面的代码:数字在Windows批处理文件比其他都大于和小于

if %bakfilesize% geq %freespacet% echo baksize is larger 
if %bakfilesize% leq %freespacet% echo baksize is smaller 

当我运行它,我在屏幕上得到以下的输出:

if 399502220288 GEQ 463777075200 echo baksize is larger 
baksize is larger 

if 399502220288 LEQ 463777075200 echo baksize is smaller 
baksize is smaller 

任何人都可以告诉我这里发生了什么事吗?我尝试了一个简单的版本号码1和2,并且窗口可以确认1确实小于2,那么为什么它在这种情况下失败?

我只真的需要geq语句才能工作。另一个是要证明这种奇怪。

+0

有关解释和解决方法,请参阅[Windows批处理文件中断失败 - 30000000000000如何等于40000000000?](http://stackoverflow.com/q/9116365/1012053)。 – dbenham

回答

1

好的,在这种情况下,问题很简单。试试这个,因为它是在你的榜样:

set /a bakfilesize=399502220288 

您将收到此错误:

Invalid number. Numbers are limited to 32-bits of precision.

因此,这意味着你要处理的数字太大而DOS无法比较他们适当地。

+1

呵呵 - 我敢肯定,如果有无效的数字,“如果”会比较字符串比较。显然,它没有。 – Stephan

1

您在样本中提供的数字都太大而不适合32位整数。我手边没有一个参考文件来确认它,但如果CMD.EXE使用32位有符号整数算术,那么一点也不奇怪。

463777075200 is 0x6BFB449000 
399502220288 is 0x5D04301C00 

如果这些值是通过CMD截断为32位,则更大的值似乎是一个负数(0xFB449000是-79392768)和确实小于截断时它仍然是正的较小值( 0x04301C00是70261760)。

在原来的问题中,它被编辑来纠正你交换变量以及比较运算符的明显错误。尝试:

if %bakfilesize% geq %freespacet% echo baksize is larger 
if %bakfilesize% leq %freespacet% echo baksize is smaller 

您可能还需要考虑一下你的代码会做什么(和应该做的),当他们是平等的......但我会离开,考虑到作为一个练习留给读者。

+0

@BeanFrog我修改了我的答案,并考虑了要比较的值的大小。 – RBerteig

相关问题