我在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的解决方案更新了上述问题。
答案 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找到。