我有批处理文件,用文件写入文本文件。需要从文件中处理每条记录。例如,如果Name
== KD
,请转到第1步,否则继续执行后续步骤。
进入第1步后出现问题,退出文件。我需要回到下一条记录继续使用DF
进行处理。我确实在该部分添加了标签,但它仍然只处理KD
条记录。
文本文件示例:
Line Name Container
1 KD 123
2 DF 657
代码:
set txtfilepath=C:\Temp\Test.txt
set /a cnt=0
for /f %%a in ('type "%txtfilepath%"^|find "" /v /c') do set /a cnt=%%a
echo %txtfilepath% has %cnt% lines
for /f "skip=1 tokens=1,2,3,4,5* delims=,] " %%a in ('find /v /n "" ^< %txtfilepath%') do (
echo.%%b - this displays variable fine.
if %%b==DF (
set result=true
) else (
goto donotexecute
)
echo I am in true loop.
:donotexecute
echo i am in do not import loop
)
:Done
所以代码进入donotexecute
标签然后我无法返回到我的初始for循环以继续文本文件中的下一行。
答案 0 :(得分:1)
首先,如果您只想为环境变量赋值,请不要使用set /a
(评估算术表达式)。
环境变量总是字符串类型。在算术表达式上,直接指定或由环境变量保持的每个数字临时转换为32位有符号整数以评估表达式,并且整数结果最终转换回存储在指定环境变量中的字符串。将数字字符串直接分配给环境变量要快得多。
其次,Windows命令处理器不支持 FOR 循环中的标签。你需要使用子程序。
@echo off
set "txtfilepath=C:\Temp\Test.txt"
rem Don't know why the number of lines in the files must be determined first?
set "cnt=0"
for /F %%a in ('type "%txtfilepath%" ^| %SystemRoot%\System32\find.exe "" /v /c') do set "cnt=%%a"
echo %txtfilepath% has %cnt% lines.
for /F "usebackq skip=1 tokens=1-5* delims=,] " %%a in ("%txtfilepath%") do (
if "%%b" == "DF" (
call :ProcessDF "%%c"
) else if "%%b" == "KD" (
call :ProcessKD "%%c"
)
)
echo Result is: %result%
rem Exit processing of this batch file. This command is required because
rem otherwise the batch processing would continue unwanted on subroutine.
goto :EOF
rem This is the subroutine for name DF.
:ProcessDF
echo Processing DF ...
set "result=true"
echo Container is: %~1
goto :EOF
rem The command above exits subroutine and batch processing continues
rem on next line below the command line which called this subroutine.
rem This is the subroutine for name KD.
:ProcessKD
echo Processing KD ...
echo Container is: %~1
rem Other commands to process.
goto :EOF
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
echo /?
find /?
for /?
goto /?
if /?
rem /?
set /?
type /?
exit /B
也可以在使用goto :EOF
的任何地方使用,因为它完全相同。在命令提示符窗口exit /?
中运行以获取详细信息。有时在较大的批处理文件中,使用例如exit /B
用于退出批处理文件和goto :EOF
用于退出子例程的处理是有意义的。