2014-01-30 38 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