2012-07-25 116 views
1

每个文本文件的行和循环我有这样的代码CMD /批量提取变量

@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 

请帮我做错了什么?


只是一点点额外的requried

我需要什么第一OCUR在

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 

对于愚蠢的问题抱歉,但批处理编码对我来说很困难。

+0

关于更新的问题 - 获取文件中的行数并不直观,所以我会将其添加到我的答案中。但对于剩下的部分,你应该再考虑一下你的问题。大部分你所要求的都是简单的逻辑。如果您能够编写您的原始代码,那么您应该能够自行解决大部分新问题。提示 - 您只需对接受的答案进行微小的更改 - 修改DirCount值并移动“设置T =!T!../'行的位置。 – dbenham 2012-07-26 14:20:09

回答

3

你有3个问题:

1)主回路后,您不退出程序,因此属于通过进入子程序

2)你的/ 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 
+0

完美!非常感谢!!! – 2012-07-26 09:44:34

+0

@DmitrijHolkin - 我可能发现了一个额外的问题。在我的回答中看到标有* EDIT *的新章节。 – dbenham 2012-07-26 12:07:06

+0

@DmitrijHolkin - 我已经部分回答了您的其他问题。其余的由你决定:-) – dbenham 2012-07-26 14:39:07