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

Mik*_*ike 46 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%
)
Run Code Online (Sandbox Code Playgroud)

但是变量c没有递增; 它保持在1.

建议欢迎.

谢谢,迈克

Fra*_*ack 83

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

这意味着%c%echo %%i, %c%可以立即进行扩展,因此实际上echo %%i, 1在每次循环迭代中都会使用.

所以你需要的是延迟变量扩展.在这里找到一些很好的解释.

应该延迟扩展的变量用!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
Run Code Online (Sandbox Code Playgroud)

  • @Mike:如果它能解决您的问题,您应该将此答案标记为已接受! (3认同)

cur*_*age 5

我想补充一点,以防万一,您在循环中创建局部变量时,也需要使用bang(!)表示法对其进行扩展。如果我们要创建基于计数器的输出文件名,在上面的/sf/answers/204378961/上扩展示例

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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

set /a "counter=0"
Run Code Online (Sandbox Code Playgroud)

-> 你的 for 循环在这里

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
Run Code Online (Sandbox Code Playgroud)