我试图运行的命令是:
::%items% is defined elsewhere and is the amount of items per line in the file
FOR /F "usebackq tokens=1-%items% delims=," %%1 IN (`TYPE %TextFile%`) DO (
FOR /l %%a in (%items%,-1,1) do (
set /a "number=%%a"
echo !number!
:: This is the main command I believe im having issues with
set word!number!=%%!number!
echo !word1!
echo !word2!
echo !word3!
)
set /a "lineused%randomline%=1"
goto exitloop
)
:exitloop
pause
现在我要做的是设置名为wordX的变量,其中X是令牌的编号。编辑:基本上,尝试使用来自上部的%%变量for循环,其中较低的一个在其中运行。 我可以输入
的所有行set word1=%%1
set word2=%%2
set word3=%%3
但这会破坏我正在努力构建的多功能系统的目的。 在这种情况下,文本文件的格式(%TextFile%)就是:
line1i1,line1i2
line2i1,line2i2
但我还需要它,例如:
line1i1,line1i2,line1i3,line1i4
line2i1,line2i2,line2i3,line1i4
答案 0 :(得分:1)
有趣的想法,但这不起作用,因为FOR变量扩展在延迟扩展之前发生。你需要一种方法来获得额外的FOR变量扩展。
您可以调用子例程,然后使用虚拟FOR循环重新建立FOR上下文。只要您处于FOR循环上下文中,FOR变量就是全局范围的。因此,您的子例程可以访问之前定义的FOR变量。
...
...
FOR /F "tokens=1-%items% delims=," %%1 IN ('TYPE %TextFile%') DO (
FOR /l %%a in (%items%,-1,1) do call :set %%a
echo !word1!
echo !word2!
echo !word3!
)
...
...
exit /b
:set
for %%. in (.) do set "word%1=%%%1"
exit /b
上述工作,但我不喜欢它,因为CALL很昂贵(慢)。当您只有几个CALL时,这通常不是问题。但在这种情况下,CALL处于紧密循环中 - 每列一次乘以文件中的行数。哎哟!
如果你真的想要参数化你的SET语句,并且你想要不错的性能,那么你可以定义一个动态的宏#34;。只需将所需命令存储在变量中,然后在循环中执行变量的内容。
另请注意,上述内容仅限9项(如果以0开头而不是1项,则为10项)。如果使用字母和查找字符串,则很容易将支持的项目数扩展到26。
最后,您的动态FOR在一些带括号的块中。据推测,您的ITEMS是在块外定义的,否则%items%
无法在FOR / F定义中使用。必须使用常规扩展来扩展SET宏,因此应该在定义ITEMS的同时定义它 - 在外部循环之外。
set /a items=3
::Define SET macro
set "v= ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "set="
for /l %%N in (1 1 %items%) do set "set=!set!&set "word%%N=%%!v:~%%N,1!""
set "set=!set:~1!"
FOR ... some loop ... DO (
...
...
FOR /F "tokens=1-%items% delims=," %%A IN ('TYPE %TextFile%') DO (
%set%
echo !word1!
echo !word2!
echo !word3!
)
...
...
)
如果必须在外部循环中设置ITEMS变量,则必须调出循环以建立内部FOR / F循环。
答案 1 :(得分:0)
请注意,您不需要TYPE
来获取文件内容,FOR
命令本身可以迭代文件内容
您可以尝试这样的事情:
@echo off
setlocal enabledelayedexpansion
set "TextFile=textfile.txt"
set /a "lineNum=0"
set /a "i=0"
for /f "tokens=*" %%a in (%TextFile%) do (
set /a lineNum=!line_num! + 1
set "line=%%a"
for %%b in ("!line:,=" "!") do (
set /a "i=!i!+1"
set /a "wordNum=!lineNum! * !i!
set "word!wordNum!=%%b"
)
)
echo !word1!
echo !word2!
echo !word3!
给定一个包含内容的文件:
aaa,bbb,ccc,ddd
eee,fff,ggg,hhh
输出将是:
"aaa"
"bbb"
... and so on
要删除引号,请在%%~b
行的内部FOR处使用set "word!wordNum!
。
另请注意,您甚至不需要定义每行的项目数量!
希望它有所帮助, 干杯!