CMD计划;至于;循环误差

CMD计划;至于;循环误差,cmd,Cmd,在上面的代码中,我得到了apk数组的长度为9,但是for循环打印的回波关闭了10次?! 我可以访问数组o_o的各个元素,也可以在用户选择正确显示的选项后下载代码。我做错了什么?作为一个非常快速的解决方法,试试看 echo off set apk[0]=apk for /r %%a in (.apk) do call array.bat add apk %%a call array.bat len apk length echo apk files found = %length% for /l

在上面的代码中,我得到了apk数组的长度为9,但是for循环打印的回波关闭了10次?!
我可以访问数组o_o的各个元素,也可以在用户选择正确显示的选项后下载代码。我做错了什么?

作为一个非常快速的解决方法,试试看

echo off
set apk[0]=apk
for /r %%a in (.apk) do call array.bat add apk %%a
call array.bat len apk length
echo apk files found = %length%
for /l %%G in (1,1,%length%) do (
call array.bat getitem apk %%G item
echo %item%
)
echo Pick one:
set /p pick=
call array.bat getitem apk %pick% chose
echo.
echo You picked %chose%.
pause
这是延迟扩展的第7863代。关于这个主题有数百个SO条目。在块语句
(一系列带括号的语句)
中,解析整个块,然后执行。在解析块时,块内的任何
%var%
都将替换为该变量的值——在执行块之前——这同样适用于。。。DO(块)

因此,在遇到
IF
时,将使用
%variables%
的值执行
IF(somethingelse)

克服此问题的两种常见方法是:1)使用
setlocal enabledelayedexpansion
!瓦尔
代替
%var%
以访问
var
的更改值,或2)调用子例程以使用更改的值执行进一步处理

因此,请注意使用了
CALL ECHO%%var%%
,它显示了
var
的更改值<代码>调用ECHO%%errorlevel%%显示,但遗憾的是随后重置errorlevel


还请注意,使用原始代码显示的项目是上次运行中设置的最后一个项目。批处理中没有
setlocal
命令,因此环境更改将永久建立,而不是在每个批处理结束时退出。其结果是您在受污染的环境中运行。

setLocal Enabled解决了我实际上不理解的问题><但我会用谷歌搜索它
call echo %%item%%