我正在尝试编写一个批处理文件,该文件读取文本文件中的每一行并将其(每行)分配给一个变量。
我正在使用此处的示例: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
答案 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
现在,执行调用,再次解析行以执行回显,并检索正确变量的值。