批量“+意外”错误
Batch '+ unexpected' error
我正在尝试批量编写 collatz 猜想测试程序(这是数学方面的东西)。该文件的要点是测试一个数是否为偶数,以及它是否被二除。如果数字是奇数,它应该乘以三并加一。这应该一遍又一遍地循环。每次我尝试 运行 这个文件时,它都会让我输入数字,然后它会说“+ 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 启用时,如果表达式放在 ""
中,则 !
运算符需要像 ^!
一样转义,否则 ^^!
。
我正在尝试批量编写 collatz 猜想测试程序(这是数学方面的东西)。该文件的要点是测试一个数是否为偶数,以及它是否被二除。如果数字是奇数,它应该乘以三并加一。这应该一遍又一遍地循环。每次我尝试 运行 这个文件时,它都会让我输入数字,然后它会说“+ 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 启用时,如果表达式放在 ""
中,则 !
运算符需要像 ^!
一样转义,否则 ^^!
。