我遇到嵌套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. --------
)
答案 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