【问题标题】:Counting in a FOR loop using Windows Batch script使用 Windows Batch 脚本在 FOR 循环中计数
【发布时间】:2011-09-22 23:38:15
【问题描述】:

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

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    它不起作用,因为 整个 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 实际上限制了内部更改的范围,以便它们不会泄漏。如果您想在endlocal 之后使用count ,则必须使用因遇到的问题而成为可能的“技巧”:

    endlocal && set count=%count%
    

    假设count 在内部范围内变成了 7。因为整个命令在执行之前被解释,它实际上变成了:

    endlocal && set count=7
    

    然后,当它执行时,内部范围被关闭,将count 返回到它的原始值。但是,由于将count 设置为 7 发生在外部范围内,因此它实际上泄露了您需要的信息。

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

    endlocal && set count=%count% && set something_else=%something_else%
    

    【讨论】:

    • 难道不能只使用 SETLOCAL ENABLEDELAYEDEXPANSION 减去 ENABLEEXTENSIONS 吗?
    • @Mechaflash:可能,我从未尝试过。因为我也使用其他东西,所以我总是在我的脚本顶部有那一行。
    • 是的,事实证明这是一次非常重要的学习体验,就“启用延迟扩展”的含义及其用途而言。
    • !count! 是它!感谢您解释 !%
    【解决方案2】:

    对于 a = 1 到 100 步 1

    Windows 中的命令行。如果在批处理文件中运行,请使用 %%a。

        for /L %a in (1,1,100) Do echo %a 
    

    【讨论】:

    • 您的回答与问题无关
    • 这是我在搜索“counted for loop windows batch”时一直在寻找的答案
    • 我也是——这对我来说非常有效,而且简单而优雅。
    • 这正好回答了标题中的问题。下一次,学会更好地总结你的问题;)
    • for /L %a in (1,1,100) Do echo %a for pseudo for a = 1 to 100 step 1 是一个糟糕的例子。更好的方法是 for /L %a in (1,5,100) Do echo %a for pseudo for a = 1 to 100 step 5 因为它清楚地暗示了语法 for /L %a in (start,step,end)
    【解决方案3】:

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

    【讨论】:

    • 您可以保存批处理文件并从命令行运行它。然后,您可以在命令行中执行“ip.bat> ip.csv”,它将生成 IP 地址的 csv。
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多