这段代码不能正常工作是因为整个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
还原至其初始值。但是,由于将count
设置为七的操作发生在外部作用域中,因此可以泄漏所需的信息。
您可以将多个子命令串联起来,以泄漏尽可能多的信息:
endlocal && set count=%count% && set something_else=%something_else%
SETLOCAL ENABLEDELAYEDEXPANSION
而不包括ENABLEEXTENSIONS
行不行? - Anthony Miller!
和%
的区别! - AndrewRalon