批处理文件中的“如果”条件

时间:2011-12-02 05:53:46

标签: batch-file cmd dos

我在cmd批处理文件中获得所需结果时遇到问题。我需要以下面提到的格式打印结果

@echo off
setlocal enabledelayedexpansion
for %%i in (8 7 6 5 4 3 2) do (

echo %%i
if %%i EQU 8 goto lvl8
if %%i EQU 3 goto lvl35
if %%i EQU 2 (goto lvl3) else goto lvls

:lvl8
set str1=8
set str2=16

:lvl35
set str1=3.5
set str2=4

:lvl3
set str1=3
set str2=3.5

:lvls
set str1=%%i

set /A str2=%%i+1

echo %%i
rem echo.!str!
echo.!str1!
echo.!str2!
)
endlocal

预期产出

8
8
16
7
7
8
6
6
7
5
5
6
4
4
5
3
3.5
4
2
3
3.5

现在我得到以下内容:

8
Missing operand
%i

%i
3.5

编辑:根据Joey的解决方案更新了上述问题。

1 个答案:

答案 0 :(得分:3)

%i%没有任何价值。您打算使用%%i吗?

澄清一下cmd在这里看到的内容:

if  EQU 8 goto lvl8
if  EQU 3 goto lvl35
if  EQU 2 (goto lvl3) else goto lvls

这显然是语法错误。


好的,编辑完成后,仍有一些问题。如果您使用goto,则显然会离开for循环。因此,在goto %%i没有值后,循环只会运行一次。

然后就是你使用goto的方式; goto是跳转到代码中的特定行。程序流程在此之后正常继续,因此如果您跳转到lvl8,您最终也会运行所有后续行,即使是:lvl35:lvl3:lvls之后的行。跳转到每个部分后,你必须在循环结束时包含一个显式跳转,以跳过不需要的行。但这不是重点,因为您无法在goto循环中使用for,如上所述。

所以你应该做的第一件事是摆脱goto而是使用结构化编程。 if也可以接受阻止。然后您经常输出%%i,这也很容易纠正。

现在看起来像这样:

@echo off
setlocal enabledelayedexpansion
for %%i in (8 7 6 5 4 3 2) do (
    echo %%i

    if %%i EQU 8 (
        set str1=8
        set str2=16
    ) else if %%i EQU 3 (
        set str1=3.5
        set str2=4
    ) else if %%i EQU 2 (
        set str1=3
        set str2=3.5
    ) else (
        set str1=%%i
        set /A str2=%%i+1
    )

    rem echo %%i
    rem echo.!str!
    echo.!str1!
    echo.!str2!
)
endlocal

请注意,每个if也有一个else,以避免为else以外的所有号码运行最后2。输出现在是正确的。代码也可以in my SVN repository找到。