2010-05-26 128 views
38

我想从文件中读取文本行,并增加一个计数器,这样我最终可以在DOS中模拟一个数组。如何在FOR/F循环中增加一个DOS变量?

我想能够文本行存储在DOS阵列以用于进一步处理。

我现在的尝试是:

set TEXT_T="myfile.txt" 

set /a c=1 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1 
echo %%i, %c% 
) 

但变量c不递增;它保持在1.

建议欢迎。

谢谢,迈克

回答

72

你的代码片段的问题是变量扩展的方式。变量扩展通常在首次读取语句时完成。在你的情况下,整个FOR循环及其块被读取,除了循环变量之外的所有变量都被扩展为它们的当前值。

这意味着在您的echo %%i, %c%立即扩展,因此实际上在每个循环迭代中用作echo %%i, 1

所以,你需要的是延迟变量扩展。找到一些关于它的好解释here

变量应该是延迟扩展与!VARIABLE!代替%VARIABLE%参考。但是您需要使用setlocal ENABLEDELAYEDEXPANSION激活此功能,并使用匹配的endlocal重置该功能。

你修改后的代码看起来类似的东西:

set TEXT_T="myfile.txt" 

set /a c=1 

setlocal ENABLEDELAYEDEXPANSION 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1 

    echo %%i, !c! 
) 

endlocal 
+0

超酷!这正是我所需要的。 我相应地修改了脚本,它现在按我的预期运行。 感谢您的快速回答。 - Mike – Mike 2010-05-27 18:11:56

+3

@Mike:如果它解决了您的问题,您应该将此答案标记为已接受! – Sk8erPeter 2011-12-03 02:17:10

+0

@Frank Bollack。非常感谢这个解释,我学到了一些新东西。我用这种技术来回答这个问题:http://serverfault.com/questions/664202/batch-file-that-kills-a-certain-process。它的工作原理,但我不知道我应该如何引用变量_outside_ FOR循环。它是否有所作为,使用!c!或%c%,在那之后如果我有FOR? – pgr 2015-02-02 10:52:38

3

我想在你创建局部变量的循环中,他们需要使用爆炸符号作为扩大到添加的情况下(!)好。扩展的例子在https://stackoverflow.com/a/2919699以上,如果我们想创建一个基于反输出文件名

set TEXT_T="myfile.txt" 

set /a c=1 

setlocal ENABLEDELAYEDEXPANSION 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1 
    set OUTPUT_FILE_NAME=output_!c!.txt 
    echo Output file is !OUTPUT_FILE_NAME! 
    echo %%i, !c! 
) 

endlocal 
2

或者你也可以做到这一点,而无需使用延迟。

set /a "counter=0" 

- >您的for循环这里

do (
    statement1 
    statement2 
    call :increaseby1 
) 

:increaseby1 
set /a "counter+=1" 
0
set TEXT_T="myfile.txt" 
set /a c=1 

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c+=1 
    set OUTPUT_FILE_NAME=output_%c%.txt 
    echo Output file is %OUTPUT_FILE_NAME% 
    echo %%i, %c% 
) 
0

使用Windows 7无法获取EnableDelayedExpansion做它的事。我有两个测试文件,分别叫做Test1.tstTest2.tst。我只想做第一件事。这两个地方我'!'没有解决的价值。最后的echo打印零。这里是我的代码:

set /a count1=0 

setlocal EnableDelayedExpansion 
for %%x in (*.tst) do (

    if !count1! GTR 0 goto :getout 

    call :addit 

    type %%x 

    ren %%x *.xxx 

) 
@echo Almost done... 
goto :alldone 

:addit 
set /a count1=%count1% + 1 
@echo %count1% 
goto :eof 

:getout 
@echo Getting out... 
@echo !count! 

:alldone 
endlocal 
-1

什么这个简单的代码,对我的作品,并在Windows 7

set cntr=1 
:begin 
echo %cntr% 
set /a cntr=%cntr%+1 
if %cntr% EQU 1000 goto end 
goto begin 

:end