CMD/Batch 从变量中提取每个文本文件行并循环
Posted
技术标签:
【中文标题】CMD/Batch 从变量中提取每个文本文件行并循环【英文标题】:CMD/Batch extract each text file line and loop from variable 【发布时间】:2012-07-24 05:39:41 【问题描述】:我有这个代码
@Echo Off
SetLocal EnableDelayedExpansion
SET mydir=D:\
SET DirCount=2
SET T=
For /F %%i In (qqq.txt) Do (
set fg=%%i
FOR /L %%G IN (2, 1, %DirCount%) DO (call :subroutine "%%i")
)
:subroutine
Set T=!T!../
start /wait %mydir%program.exe %T%%fg%
echo %t%%fg% >>%cd%see.log
qqq.txt 有行
1
2
3
结果我得到:
../1
../../2
../../../3
../../../../3
但我需要这样:
../1
../../1
../2
../../2
../3
../../3
请帮助我做错了什么?
只需要一点额外的要求
我需要第一次发生的事情
set "T=!T!../"
will be without dots
set "T=!T!/"
result must be
/1
../1
../../1
/2
../2
../../2
如何以及在何处添加计数器并使每个循环可见
echo Now looping: %%i row of %countrow(in qqq.txt), left %countrow-%%I
echo Now looping: Dir Nr%%G !T!%%i
抱歉,我提出了一些愚蠢的问题,但批量编码对我来说很难。
【问题讨论】:
关于更新的问题 - 获取文件中的行数并不直观,因此我将其添加到我的答案中。但是对于其余部分,您应该更多地考虑您的问题。您所问的大部分内容都涉及简单的逻辑。如果您能够编写原始代码,那么您应该能够自己解决大部分新问题。提示 - 您只需要对已接受的答案进行微小的更改 - 修改 DirCount 值并移动行的位置Set T=!T!../
。
【参考方案1】:
你有 3 个问题:
1) 你不会在主循环之后退出你的程序,所以它会进入子程序
2) 你的 FOR /L IN() 子句是错误的,第一个数字应该是 1,而不是 2
3) 您需要在外循环中将 T 重置为 undefined。
编辑
我相信您可能还有其他问题。重定向输出时,您可以在文件名前加上 %cd%
。我认为这不会给出你想要的结果。如果您的当前目录是C:\test
,那么>>%cd%see.log
将导致输出发送到根C:\
目录中名为testsee.log
的文件。如果您想要当前目录中的输出,那么它应该是>>%cd%\see.log
,但实际上并不需要路径信息,因为默认是使用当前目录。所以你真正需要的是>>see.log
。由于我不知道您的意图,因此我已按原样保留重定向。 结束编辑
@echo Off
SetLocal EnableDelayedExpansion
SET mydir=D:\
SET DirCount=2
For /F %%i In (qqq.txt) Do (
SET T=
set fg=%%i
FOR /L %%G IN (1, 1, %DirCount%) DO (call :subroutine "%%i")
)
exit /b
:subroutine
Set T=!T!../
start /wait %mydir%program.exe %T%%fg%
echo %t%%fg% >>%cd%see.log
在您的情况下不需要调用子例程,特别是因为您已经启用了延迟扩展。下面用更少的代码给出了相同的结果,而且速度更快,因为它避免了相对较慢的 CALL 语句。 (在这个小例子中,性能可能不是问题,但如果使用具有多次迭代的循环,它会产生巨大的差异)
@echo Off
SetLocal EnableDelayedExpansion
SET mydir=D:\
SET DirCount=2
For /F %%i In (qqq.txt) Do (
SET "T="
FOR /L %%G IN (1, 1, %DirCount%) DO (
set "T=!T!../"
start /wait %mydir%program.exe !T!%%i
echo !T!%%i >>%cd%see.log
)
)
对其他问题的部分回答
您可以使用FOR /F 捕获FIND /C 的结果来获取“qqq.txt”中的行数。这应该在你进入主循环之前完成:
for /f %%N in ('find /c /v "" ^<qqq.txt') do set "rowCount=%%N"
您可以使用 SET /A 进行基本数学运算,从而使您能够跟踪剩余行数
进入主循环前先初始化剩余计数:
set "remainingLines=%rowCount%"
然后在主循环中使用 SET /A 递减值。
set /a remainingLines-=1
【讨论】:
@DmitrijHolkin - 我可能发现了另一个问题。请参阅我的答案中标记为 EDIT 的新部分。 @DmitrijHolkin - 我已经部分回答了您的其他问题。剩下的就看你了:-)以上是关于CMD/Batch 从变量中提取每个文本文件行并循环的主要内容,如果未能解决你的问题,请参考以下文章