如果大于批处理文件

时间:2017-06-01 12:29:05

标签: batch-file

我有一个非常愚蠢的问题,但无法弄清楚出了什么问题

我在if语句中进行基本级别编号比较。脚本粘贴在下面。 geq-大于或等于工作正常,但gtr-大于有问题。 gtr比较中的数字是否有限制?

if 3 gtr 2 (@echo "greater") else (@echo "lesser")
greater

if 3 geq 2 (@echo "greater") else (@echo "lesser")
greater

if 135149772801 gtr 111110000000 (@echo "greater") else (@echo "lesser")
lesser

if 135149772801 geq 111110000000 (@echo "greater") else (@echo "lesser")
greater

3 个答案:

答案 0 :(得分:3)

  

gtr比较中的数字是否有限制?

是的,确实是。

您只能使用32位有符号整数,如果有溢出,则将其设置为最大值。

由于这两个这些数字135149772801111110000000太大,所以它们都被转换为231 - 1

这就是为什么它说第一个不是更大(顺便说一下,它与次要的略有不同)但 大于或等于。

更多细节可以在优秀的dostips site找到。

答案 1 :(得分:2)

绕过32位限制的方法是在数字字符串前加上一个很好的0,然后在最后的 n 字符上使用字母比较。

因此

set "num1=135149772801"
set "num2=111110000000"
set "zeroes=00000000000000000000000000000000000000000000000000000"

set "comp1=%zeroes%%num1%"
set "comp2=%zeroes%%num2%"

if "%comp1:~-20%" gtr "%comp2:~-20%" (echo greater) else (echo not greater)

其中“-20”表示“取最后20个字符”

答案 2 :(得分:0)

本身仅支持32位有符号整数运算。如果数字超过2147483648,它会溢出并回转到负数。但是,在if语句中,数字会变得混乱,回到2^31-1

Code                   | Code Result       | Actual Result
-----------------------+-------------------+-----------------------
2147483647 + 1           2147483648          2147483648
2147483648 + 1          -2147483648          2147483649

以下是一些可行的解决方法:

  • 砍掉数字(比较前使数字变小)
  • 其他脚本语言(使用powershellvbs进行比较)

嵌入式Powershell解决方案:

for /f %p in ('powershell -command if (1 -gt 0^) {write-host greater} else {write-host lesser}') do echo %p

此命令调用powershell进行比较,并使用for循环检索结果。