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 从变量中提取每个文本文件行并循环的主要内容,如果未能解决你的问题,请参考以下文章

C ++从文本文件中读取行并编辑

MATLAB;如何从头文件(文本文件)中提取信息

从VBA中的PowerPoint文件中提取所有文本

Linux Bash - 修改从标准输出中提取的文本

从文本文件中提取不均匀的数据

R-将提取的文本数据(每个实例作为行)导出为data.frame格式