我的批处理文件中有以下代码:
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的简单版本,并且Windows可以确认1确实小于2,那么为什么在这种情况下失败?
我只需要geq语句才能工作。另一个是展示奇怪的。
答案 0 :(得分: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
你可能还想考虑一下你的代码在他们平等时会做什么(并且应该做什么)......但我会把这个考虑作为读者的练习。
答案 1 :(得分:1)
好的,在这种情况下,问题很简单。试试这个就像你的例子:
set /a bakfilesize=399502220288
您将收到此错误:
号码无效。数字限制在32位精度。
所以这意味着您处理的数字太大而且DOS无法正确地比较它们。