在批处理文件中:如何回显从For循环中的文本文件中的行分配的每个变量?

时间:2014-09-09 14:15:46

标签: batch-file cmd

我正在尝试编写一个批处理文件,该文件读取文本文件中的每一行并将其(每行)分配给一个变量。

我正在使用此处的示例:Read each line in a txt file and assign variables using windows dos commands,即:

SETLOCAL EnableDelayedExpansion
SET count=1
FOR /F "tokens=* delims= usebackq" %%x IN ("%TEXT_T%") DO (
SET var!count!=%%x
SET /a count=!count!+1
)
ENDLOCAL

现在,我想做的就是回应每个变量的结果,但我似乎无法做到这一点。下面是我所拥有的,它给了我三次var0的结果 - 我的文本文件有三行。我将计数的开始从上面的代码从1更改为0.

@echo off
SETLOCAL EnableDelayedExpansion
SET count=0
FOR /F "tokens=* delims= usebackq" %%x IN ("afile.txt") DO (
SET var!count!=%%x
echo !var%count%!
SET /a count=!count!+1
echo !count!
)
ENDLOCAL

1 个答案:

答案 0 :(得分:2)

虽然这段代码

echo !var%count%!

似乎是逻辑,因为count在循环内被更改,您无法在没有延迟扩展的情况下访问变量的值。但

      echo !var!count!!
           ^...^     ^^
first variable        second "variable"

将无效,因为解析器无法正确确定每个变量引用的开始/结束位置

您可以使用以下两行中的任何一行

for %%a in (!count!) do echo !var%%a!

call echo %%var!count!%%

它是如何运作的?

最初的想法很好,但语法有限。我们需要对var..变量进行延迟扩展,但也需要count

1 .- 在第一个解决方案中,我们将count变量的延迟扩展存储在for可替换参数中,而不是使用{{1} count命令中的变量,仅在echo变量周围保留延迟扩展。

var

2 .- 在第二个解决方案中,使用!var!count!! => %%a=!count! => !var%%a! 命令。此调用导致对行进行双重评估,首先在行解析时执行call,第二次调用执行。就是这一行

call
首先解析

,其中引用的唯一变量是call echo %%var!count!%% (双百分号是单个转义百分号),因此该行被转换为(假设!count!包含{{1 }})

count

现在,执行调用,再次解析行以执行回显,并检索正确变量的值。