如何在FOR / F循环中增加DOS变量?

时间:2010-05-26 13:13:43

标签: arrays dos

我正在尝试从文件中读取文本行,并递增计数器,以便最终在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。

建议欢迎。

谢谢,迈克

6 个答案:

答案 0 :(得分:79)

代码段的问题在于扩展变量的方式。变量扩展通常在首次读取语句时完成。在您的情况下,将读取整个FOR循环及其块,并且除循环变量之外的所有变量都将扩展为其当前值。

这意味着%c%中的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

答案 1 :(得分:4)

我想补充一点,如果你在循环中创建局部变量,它们也需要使用bang(!)表示法进行扩展。如果我们想要创建基于计数器的输出文件名

,请在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 :(得分:3)

或者您可以在不使用延迟的情况下执行此操作。

set /a "counter=0"

- >你的循环在这里

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"

答案 3 :(得分: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%
)

答案 4 :(得分: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

答案 5 :(得分:0)

这个简单的代码怎么样,适合我和Windows 7

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

:end
相关问题