任何人都能解释一下吗?我可以使用Windows命令提示符计算循环,使用此方法:
SET /A XCOUNT=0
:loop
SET /A XCOUNT+=1
echo %XCOUNT%
IF "%XCOUNT%" == "4" (
GOTO end
) ELSE (
GOTO loop
)
:end
但是这种方法不起作用(它为文件中的每一行打印出“1”)。它的作用就像变量超出范围:
SET /A COUNT=1
FOR /F "tokens=*" %%A IN (config.properties) DO (
SET /A COUNT+=1
ECHO %COUNT%
)
答案 0 :(得分:53)
它不起作用,因为整个 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
使用!
代替%
进行延迟展开会为您提供预期的行为。另请参阅here。
另请注意,setlocal/endlocal
实际上限制了内部更改的范围,以便它们不会泄漏。如果您希望在<{em> count
之后使用endlocal
,则必须使用您遇到的问题所带来的“技巧”:
endlocal && set count=%count%
假设count
已成为内部范围内的7。因为整个命令在执行之前被解释,所以它实际上变为:
endlocal && set count=7
然后,当执行时,内部范围将关闭,将count
返回到原始值。但是,由于count
到7的设置发生在外部范围内,它会有效地泄露您需要的信息。
您可以将多个子命令串在一起,以便根据需要泄漏尽可能多的信息:
endlocal && set count=%count% && set something_else=%something_else%
答案 1 :(得分:14)
对于a = 1到100步骤1
Windows中的命令行。如果在批处理文件中运行,请使用%% a。
for /L %a in (1,1,100) Do echo %a
答案 2 :(得分:0)
这是一个生成所有10.x.x.x地址的批处理文件
@echo off
SET /A X=0
SET /A Y=0
SET /A Z=0
:loop
SET /A X+=1
echo 10.%X%.%Y%.%Z%
IF "%X%" == "256" (
GOTO end
) ELSE (
GOTO loop2
GOTO loop
)
:loop2
SET /A Y+=1
echo 10.%X%.%Y%.%Z%
IF "%Y%" == "256" (
SET /A Y=0
GOTO loop
) ELSE (
GOTO loop3
GOTO loop2
)
:loop3
SET /A Z+=1
echo 10.%X%.%Y%.%Z%
IF "%Z%" == "255" (
SET /A Z=0
GOTO loop2
) ELSE (
GOTO loop3
)
:end