我正在制作一个程序来运行速度/距离/时间计算。此代码适用于周围的" IF%类型%== s(...)"语句被删除,但不是当我把它放回去。它似乎运行所有线路?这是代码:
putExtra()
非常感谢任何帮助。
答案 0 :(得分:0)
首先,这里有几个主要问题。
延迟扩展问题。正如上面的评论中所述,这是一个非常重要的问题,您需要更好地理解。仅此一点,我认为在Windows批处理程序中使用嵌套IF
语句的巨型IF
块呈现此方法。你可能最好使用GOTO
(虽然它可能不优雅):
...
set /p type="Calculate [S]peed, [D]istance, or [T]ime? "
if /i %type%=S (goto calcSpeed)
else if /i %type%=D (goto calcDist)
else if /i %type%=T (goto calcTime)
:calcSpeed
set /p t="Enter the time: "
:EnterTimeUnits
set /p tUnits="Enter the time units - [H]ours, [M]inutes, [S]econds: "
if /i "%tUnits%"=="H" (
set /a divide=3600
) else if /i "%tUnits%"=="M" (
set /a divide=60
) else if /i "%tUnits%"=="S" (
set /a divide=1
) else (
echo Try again.
goto EnterTimeUnits
)
...
仅限整数。在上面的评论中也提到过,windows批处理变量只能处理整数和字符串。没有任何类型的浮点十进制数。您必须重新排列逻辑,以便将multiply
值放入powershell命令中。类似的东西:
...
if /i "%dUnits%"=="mile" (
for /f %%B IN ('powershell %d%/%t%*0.000621371/%div%') DO SET total=%%B
) else if /i "%dUnits%"=="m" (
for /f %%B IN ('powershell %d%/%t%*1/%div%') DO SET total=%%B
) else if /i "%dUnits%"=="km" (
for /f %%B IN ('powershell %d%/%t%*0.001/%div%') DO SET total=%%B
...
有了这些,我们可以继续帮助解决您的实际问题:
[]代码在删除周围的
IF
语句时有效,但在我将其放回时则不行。它似乎运行所有行。
我没有像你描述的那样看到这个问题。但是,由于嵌套IF
语句中的扩展延迟问题,它会执行一些有趣的循环,请求两次相同的输入。我认为一旦你处理好这些问题,你的其他问题就会消失。
故障排除:CLS
和@ECHO OFF
非常适合保持控制台整洁,但它们使您的程序排除故障/调试变得非常困难。删除这些行将帮助您了解正在发生的事情。