1

我有这个代码

@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

对不起,愚蠢的问题,但批量编码对我来说很难。

4

1 回答 1

3

你有3个问题:

1)你不会在主循环之后退出你的程序,所以它会进入子程序

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

3)您需要在外循环中将 T 重置为 undefined 。

编辑
我相信你可能还有一个问题。重定向输出时,您在文件名前加上%cd%. 我认为这不会给出你想要的结果。如果您的当前目录是C:\test>>%cd%see.log则将导致输出发送到testsee.logC:\目录中命名的文件。如果您想要当前目录中的输出,那么它应该是>>%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
于 2012-07-25T20:03:56.947 回答