如何在循环.bat中使用循环变量

时间:2019-12-03 06:29:05

标签: windows batch-file

我对.bat有问题

@echo off
    set NAMEFILE=version

rem counting commas
set "f=%VERSION%"
set "vz=,"
set /a "z=0,n=0"
for /f "delims=" %%a in ('findstr /r /c:"\%vz%" "%f%"') do set "s=%%a"& call :#
<+ (for /f "tokens=1,2 delims==" %%b in ('more') do set /a "z+=%%b")& del+

set /a z =%z% + 1

rem cycle with problem
rem tokens=%%a* - part of the code that contains the problem
for /l %%a in (1,1,%z%) do for /f "tokens=%%a* delims=," %%i in (%NAMEFILE%) do @echo %%i>File_%%a.vers


:#
 setlocal enabledelayedexpansion 2>nul
  for %%a in ("!s:~%n%,1!") do (

   if "%%~a"=="%vz%" set /a z+=1
   if not "%%~a"=="" set /a n+=1& goto #
  )
 endlocal
exit /b

我不知道该如何处理“ tokens = %% a”。它没有看到变量%% a,可能是由于“%”符号引起的。我认为必须将其转义或类似的内容。如果您可以帮助,请帮助。

1 个答案:

答案 0 :(得分:2)

FOR命令的选项部分中既不能使用延迟扩展也不能使用FOR参数扩展(对于IF也是如此)。
这是由批处理解析器处理它们的方式引起的。

但是正如前面所说,仅参数扩展延迟失败,扩展百分比仍然有效。

但是在您的示例中,您不能内联使用它,您需要构建一个辅助函数。

...
for /l %%a in (1,1,%z%) do call :helper_func %%a
...


:helper_func
for /f "tokens=%1* delims=," %%i in (%NAMEFILE%) do @echo %%i>File_%%a.vers

在辅助函数中,您仍然可以在%%a中使用echo %%i>File_%%a
这样的结果是,所有当前的FOR参数在所有FOR循环中都是可见的(即使它们似乎无关)。