Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops CMD/Batch从变量中提取每个文本文件行和循环_Loops_Batch File_Cmd_Text Files - Fatal编程技术网

Loops CMD/Batch从变量中提取每个文本文件行和循环

Loops CMD/Batch从变量中提取每个文本文件行和循环,loops,batch-file,cmd,text-files,Loops,Batch File,Cmd,Text Files,我有这个密码 @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%pro

我有这个密码

@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
很抱歉提出了愚蠢的问题,但批处理编码对我来说很难。

您有3个问题:

1) 在主循环之后,您不会退出程序,因此它会进入子例程

2) FOR/L IN()子句错误,第一个数字应该是1,而不是2

3) 您需要在外循环中将T重置为未定义

编辑
我相信你可能还有一个问题。重定向输出时,请在文件名前面加上
%cd%
。我认为这并不是你想要的结果。如果当前目录为
C:\test
,则
>%cd%see.log
将导致输出发送到根
C:\
目录中名为
testsee.log
的文件。如果您希望在当前目录中输出,那么它应该是
>%cd%\see.log
,但实际上不需要路径信息,因为默认情况下是使用当前目录。因此,您真正需要的是
>请参见.log
。因为我不知道你的意图,所以我将重定向保留为最初编写的结束编辑

在您的情况下不需要调用子例程,特别是因为您已经启用了延迟扩展。下面用更少的代码给出相同的结果,而且速度更快,因为它避免了相对较慢的CALL语句。(在这个小示例中,性能可能不是问题,但如果使用多次迭代的循环,则会产生巨大的差异)


对其他问题的部分回答

您可以使用FOR/F捕获FIND/C的结果,以获取“qqq.txt”中的行数。这应在进入主循环之前完成:

for /f %%N in ('find /c /v "" ^<qqq.txt') do set "rowCount=%%N"
set "remainingLines=%rowCount%"
然后在主循环中使用SET/A减小该值

set /a remainingLines-=1

@德米特里霍尔金-我可能发现了另外一个问题。请参阅“我的答案”中标记为“编辑”的新部分。@DmitrijHolkin-我已经部分回答了您的其他问题。其余的取决于您:-)关于更新的问题-获取文件中的行数不是直观的,因此我将把它添加到我的答案中。但是对于剩下的问题,你应该多想想你的问题。你所问的大多数问题都涉及简单的逻辑。如果您能够编写原始代码,那么您应该能够自己解决大多数新的Qestion。提示-您只需要对接受的答案进行一个简单的更改-修改DirCount值并移动行的位置
Set T=!T/
set "remainingLines=%rowCount%"
set /a remainingLines-=1