嵌套的for循环导致错误的结果

时间:2014-01-30 13:51:16

标签: batch-file nested-loops

我遇到嵌套for循环的一些问题。正如你在结果中看到的那样,加载了正确的行,但是将行分成两个字段的第二个循环确实是错误的

有什么想法吗?

欢呼endo

当前输出

line=user1|pass1
usr:   user2
pass:  pass2
 --------
line=user2|pass2
usr:   user2
pass:  pass2
 --------

pass.txt

user1|pass1
user2|pass2

批处理文件

cls
@echo off &setlocal

for /f "tokens=*" %%a in (pass.txt) do (
  echo line=%%a
  set "string=%%a"  

    for /f "tokens=1,2 delims=|" %%i in ("%string%") do set "variable1=%%i" &set "variable2=%%j"
    echo usr:   %variable1%
    echo pass:  %variable2%
    endlocal

set "string="
echo. --------

)

2 个答案:

答案 0 :(得分:1)

嵌套for循环正常工作。

但是不起作用的(不是预期的)是变量。在批处理脚本中,每次到达一个块(括号中的行)时,所有变量读取都将在执行前用变量中的值替换。如果在块内需要访问变量的值,并且已在块内分配/更改了该值,则必须指示应该延迟变量读取。

所以,你的代码应该是

@echo off  & cls
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in (pass.txt) do (
  echo line=%%a
  set "string=%%a"

    for /f "tokens=1,2 delims=|" %%i in ("!string!") do set "variable1=%%i" &set "variable2=%%j"
    echo usr:   !variable1!
    echo pass:  !variable2!

echo. --------

)
endlocal

setlocal enabledelayexexpansion激活此功能,%var%引用被!var! sintax替换(如果需要),表示需要延迟读取的变量。

答案 1 :(得分:0)

如果要避免延迟扩展,可以删除(临时)变量赋值并立即使用for变量"%%?"作为进一步命令的参数:

@echo off & cls
setlocal
for /f "tokens=*" %%a in (pass.txt) do (
    echo line=%%a
    for /f "tokens=1,2 delims=|" %%i in ("%%a") do (
        echo usr:   %%i
        echo pass:  %%j
        echo. --------
    )
)
endlocal

另一个想法:对于这种方法,您不需要两个嵌套循环,因为FOR命令能够立即拆分文本文件的每个读取行;试试这个:

@echo off & cls
setlocal
for /f "tokens=1,2 delims=|" %%a in (pass.txt) do (
    echo line=%%a^|%%b
    echo usr:   %%a
    echo pass:  %%b
    echo. --------
)
endlocal
相关问题