批量“+意外”错误

Batch '+ unexpected' error

我正在尝试批量编写 collat​​z 猜想测试程序(这是数学方面的东西)。该文件的要点是测试一个数是否为偶数,以及它是否被二除。如果数字是奇数,它应该乘以三并加一。这应该一遍又一遍地循环。每次我尝试 运行 这个文件时,它都会让我输入数字,然后它会说“+ is unexpected at this time.”我这里的错误是什么?

@echo off
color f0
title Collatz Conjecture Tester
echo/
echo Enter the number you want to test.
echo/
echo/
set /p number=
:start
set /a test=%number% %% 2
if %test% EQU 0 ( 
    set /a number=%number% * 1/2
) else (
    set /a number=(%number% * 3) + 1
)
echo/
echo Result: %number%
timeout /t 1 >nul
goto start

如果 if 语句、for 循环或其他代码块中有括号,请务必转义任何其他内部右括号,以便批处理解释器知道您没有完成了。

现在,batch 正在像这样读取您的 if 语句:

else (
    set /a number=(%number% * 3
)
+ 1

因此它认为您提前终止 else 并出于某种原因在其中抛出 + 1。要解决此问题,您可以使用 ^.

转义内部右括号
if %test% EQU 0 ( 
    set /a number=%number% * 1/2
) else (
    set /a number=(%number% * 3^) + 1
)

SomethingDark already found the root cause of the problem and showed a proper solution in .

避免括号和一些运算符如 &|^<<>> 等问题的替代方法。就是将set /A的整个表达式括在一对引号内:

if %test% EQU 0 ( 
    set /A "number=%number% * 1/2"
) else (
    set /A "number=(%number% * 3) + 1"
)

如果你这样做,你就不必再考虑适当的转义了。

请注意,% 运算符始终需要像批处理文件中的 %% 一样进行转义。
case delayed expansion 启用时,如果表达式放在 "" 中,则 ! 运算符需要像 ^! 一样转义,否则 ^^!