任何人都可以解释吗? 我能够使用Windows命令提示符来循环计数,使用以下方法:
SET /A XCOUNT=0 :loop SET /A XCOUNT+=1 echo %XCOUNT% IF "%XCOUNT%" == "4" ( GOTO end ) ELSE ( GOTO loop ) :end
但是这种方法不起作用(它为文件中的每一行输出“1”)。 它的行为像variables超出范围:
SET /A COUNT=1 FOR /F "tokens=*" %%A IN (config.properties) DO ( SET /A COUNT+=1 ECHO %COUNT% )
它不起作用,因为整个 for
循环(从for
到最后的右括号, 包括它们之间的命令)在遇到它之前正在被计算, 在它开始执行之前 。
换句话说,在运行循环之前, %count%
被替换为它的值1
。
你需要的东西是这样的:
setlocal enableextensions enabledelayedexpansion set /a count = 1 for /f "tokens=*" %%a in (config.properties) do ( set /a count += 1 echo !count! ) endlocal
延迟扩展使用!
而不是%
会给你预期的行为。 另见这里 。
另外请记住, setlocal/endlocal
实际上限制了内部变化的范围,以便它们不泄漏。 如果你想在endlocal
后使用count
,你必须使用一个“技巧”,使你可能遇到的问题成为可能:
endlocal && set count=%count%
假设count
在内部范围内变成了7。 由于整个命令在执行之前被解释,所以它实际上变成:
endlocal && set count=7
然后,当它被执行时 ,内部范围被关闭,返回到它的原始值。 但是,由于count
到七的设置发生在外部范围,所以有效地泄漏了您需要的信息。
您可以将多个子命令串在一起,以根据需要泄漏尽可能多的信息:
endlocal && set count=%count% && set something_else=%something_else%
对于a = 1至100步骤1
Windows中的命令行。 如果在批处理文件中运行,请使用%% a。
for /L %a in (1,1,100) Do echo %a