首页 > 解决方案 > 批处理文件:在变量中使用比较结果?

问题描述

这是示例:

set /a "number1=1"
set /a "number2=10"
if %number1% LSS %number2% (set /a "number1=%number1%+1")
echo result=%number1%

此代码显示:

result=2

是否可以在批处理文件中将if语句更改为:

set /a "number1=%number1%+(%number1% LSS %number2%)"

?

此时更改的代码显示:

Unbalanced parenthesis.
result=1

标签: if-statementbatch-file

解决方案


set /A命令不具有比较运算符。

但是,有一种方法可以比较两个数字并获取-1第一个数字是否小于第二个数字的值。为此,我们需要知道逻辑右移运算符>>实际上执行算术移位,这意味着代表符号的最高有效位的值向左移入,因此数字的当前符号为保持。

例如:

  • 右移一位的数字+10(二进制​​表示)变为(二进制表示);00000000 00000000 00000000 00001010+500000000 00000000 00000000 00000101
  • 右移一位的数字-10(二进制​​表示)变为(二进制表示);11111111 11111111 11111111 11110110-511111111 11111111 11111111 11111011

当我们向右移动 31 个(或更多)位位置时,结果是符号位的 32 倍(因为我们有 32 位有符号整数),这导致-1负输入值和0其他输入值的值。

当我们现在应用这种技术时,它会导致我们得到以下代码:

set /A "number1=%number1%-((%number1%-%number2%)>>31)"

您可以省略周围的%- 符号,因为无论如何都会set /A将任何不表示数字或运算符的字符串解释为变量名:

set /A "number1=number1-((number1-number2)>>31)"

这可以使用适当的赋值运算符进一步简化:

set /A "number1-=(number1-number2)>>31"

推荐阅读