2014-01-30 87 views
0

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

任何想法?

欢呼内切

电流输出

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. -------- 

) 
+0

如果你解释你打算做什么,或者期望的输出应该是什么样子,这将有所帮助。 – foxidrive

回答

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,表明需要延迟读取变量。

+0

超棒!很多thanx –

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 
相关问题