IF / ELSE阻止运行所有内容

时间:2016-01-12 15:47:56

标签: batch-file if-statement

我正在制作一个程序来运行速度/距离/时间计算。此代码适用于周围的" IF%类型%== s(...)"语句被删除,但不是当我把它放回去。它似乎运行所有线路?这是代码:

putExtra()

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先,这里有几个主要问题。

  1. 延迟扩展问题。正如上面的评论中所述,这是一个非常重要的问题,您需要更好地理解。仅此一点,我认为在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
    )
    ...
    
  2. 仅限整数。在上面的评论中也提到过,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
    ...
    
  3. 有了这些,我们可以继续帮助解决您的实际问题:

      

    []代码在删除周围的IF语句时有效,但在我将其放回时则不行。它似乎运行所有行。

    我没有像你描述的那样看到这个问题。但是,由于嵌套IF语句中的扩展延迟问题,它会执行一些有趣的循环,请求两次相同的输入。我认为一旦你处理好这些问题,你的其他问题就会消失。

    故障排除:CLS@ECHO OFF非常适合保持控制台整洁,但它们使您的程序排除故障/调试变得非常困难。删除这些行将帮助您了解正在发生的事情。