使用Windows批处理脚本在FOR循环中计数

使用Windows批处理脚本在FOR循环中计数,windows,batch-file,cmd,Windows,Batch File,Cmd,有人能解释一下吗?我可以使用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.proper

有人能解释一下吗?我可以使用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%
)

它不起作用,因为整个
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
设置为7是在外部作用域中进行的,因此它实际上泄漏了您需要的信息

您可以将多个子命令串在一起,以根据需要泄漏尽可能多的信息:

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 

这是一个生成所有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

只有
setlocalenabledelayedexpansion
减去
enabledextensions
,它不会工作吗?@Mechaflash:可能,我从未尝试过。我总是在我的脚本顶部有这一行,因为我也使用了其他东西。是的,事实证明这是一次关于“enabledayedexpansion”的意义及其用途的重大学习经历。
!伯爵就是它!感谢您解释
vs
%
!你的答案与问题无关这是我在搜索“counted for loop windows batch”时寻找的答案——这对我来说非常有效,而且简单而优雅。这正好回答了标题中的问题。下次,学会更好地总结你的问题;)<代码>对于(1,1100)中的/L%a,对于伪a=1到100,执行回显%a
步骤1是一个糟糕的示例。更好的方法是(1,5100)Do echo%A中的/L%A的
对于伪A=1到100步骤5,因为它清楚地暗示了(开始、步骤、结束)中/L%A的语法
您可以保存批处理文件并从命令行运行它。然后,您可以在命令行执行“ip.bat>ip.csv”,它将生成ip地址的csv。